◆ Linuxサーバのセキュリティ実装
Linuxをサーバとして運用する場合、セキュリティの観点から主に以下の3点に気をつける必要があります。
1. パスワードの管理
2. システムのポート情報、プロセス情報
3. システムリソースの使用制限
1. パスワードの管理
ユーザーパスワードは、定期的に変更したり有効期限を設定することが大切であり以下のコマンドが有効。
パスワード関連コマンド |
説明 |
passwd コマンド |
rootユーザーは全アカウントのパスワード変更可。一般ユーザーは自分のパスワードを変更可。 |
usermod コマンド |
指定したユーザーのパスワードのロックが可能。ログインシェルや所属グループも変更できる。 |
chage コマンド |
ユーザーパスワードの有効期限の情報を変更可。 |
passwdコマンドとusermodコマンドについては既に解説しているのでchageコマンドを以下で紹介します。
chageコマンドにより、パスワードに有効期限を設定して強制的にパスワード変更をユーザーに促すことが
できます。オプションを指定せずにchageコマンドを実行した場合は、対話モードとなります。
◆ 構文 : chage [ オプション] [ ユーザー名 ]
オプション |
説明 |
-l |
パスワードまたはアカウントの有効期限を表示 |
-m |
パスワード変更間隔の最低日数を設定 |
-M |
パスワードの最大有効期限の日数を設定 |
-d |
パスワードの最終更新日を設定 |
-W |
パスワードの有効期限切れの警告が何日前から始まるかを設定 |
-I |
パスワードの有効期限後、アカウントロックされるまでの日数を設定 |
-E |
ユーザーアカウントが無効になる日付を設定 |
◆ 実行例 : mikeのパスワードの最大有効期限は3週間、有効期限切れの7日前から警告、アカウント有効期限は2015年12月31日
# chage -M 21 -W 7 -I 0 -E 2015-12-31 mike |
2. システムのポート情報、プロセス情報
運用しているLinuxサーバにおいて、不要なポートが開いていないかどうかを確認することは大切です。
どのポートが開いているかどうかはnetstatコマンドで確認できます。Linuxサーバがサービス提供するに
あたり必要なポートのみを開けておき、外部からの攻撃を防ぐため不要なポートは閉じておくことが大切。
◆ netstat -atun ※ IPアドレスの右側の青枠がポート番号
また、lsofコマンドでは、ポート番号だけでなくファイルを開いているプロセス情報も同時に確認できます。
◆ 構文 : lsof オプション
オプション |
説明 |
-i ポート番号 |
指定したポート番号のIP通信のみを表示。指定しない場合、全てが対象となり表示。 |
-n |
IPアドレスからホスト名への変換をしない ( 表示が早くなる ) |
-p プロセスID |
指定したPIDのプロセスのみを表示 |
-P |
ポート番号からサービス名への変換をしない ( 表示が早くなる ) |
以上のnetstatコマンドとlsofコマンドは、自身のLinuxサーバのポート状態を確認することができますが、
以下で紹介するnmapコマンドは、相手側のLinuxサーバで開いているポートを確認することもできます。
ただし、悪意ある攻撃者がネットワーク経由で開いているポートを確認する行為は、ポートスキャンと
呼ばれており、攻撃の前段階の行為でもあるので、nmapコマンドは相手側に実行することは原則NGです。
◆ 構文 : nmap 対象ホスト
◆ 実行例 : www.example.com にポートスキャン ( nmapのソフトウェアをインストールしている必要がある )
3. システムリソースの使用制限
一人のユーザーに大量のリソースを使用されないように、各ユーザーが使用できるプロセス数などの
リソースを制限することができます。リソースの使用を制限するためにはulimitコマンドを使用します。
◆ 構文 : ulimit オプション
オプション |
説明 |
-a |
設定されている制限値を表示 |
-c サイズ |
生成されるコアファイルのサイズを指定 |
-f サイズ |
出力できるファイルサイズの上限を設定 |
-n 数 |
同時に開くことができるファイルの上限数を設定 |
-u プロセス数 |
1人のユーザーが起動できるプロセス数の上限を設定 |
-v サイズ |
シェルが処理できる仮想メモリの上限を設定 |
-H |
制限の設定をハードリミットとする |
-S |
制限の設定をソフトリミットとする |
◆ 構文 : 制限の設定値を表示
◆ ユーザーの切り替え、権限の変更
suコマンドを使用することで、ユーザーIDとグループIDを変更してシェルを起動することができます。
◆ 構文 : su オプション ユーザー名
オプション |
説明 |
-f |
初期設定ファイルを実行しない |
-l |
ログインシェルを使用 |
-c |
ユーザーの切替後、コマンドを実行 |
-s |
シェルを実行 |
- |
ログインするユーザーのシェルを使用 |
◆ 実行例 : testユーザーに切替 ( - でカレントディレクトリはtestユーザーのホームディレクトリとなり、環境変数も初期化)
$ su - test
Password : ← testユーザーのパスワードを入力
|
◆ 実行例 : rootユーザーに切替 ( - でカレントディレクトリは root ユーザーのホームディレクトリとなり、環境変数も初期化)
$ su -
Password : ← rootユーザーのパスワードを入力
|
管理者のパスワードを教えることで、そのホストの全てを操作できるのでセキュリティ的に好ましくはない。
そこでsudoコマンドを使用すれば、管理者向けのある一部のコマンドだけを一般ユーザーが実行できます。
sudoコマンドを利用するためには、事前にsudoコマンドを実行できるユーザに対するコマンドを定義します。
rootユーザーでvisudoコマンドを実行することで開かれる、/etc/sudoersファイルでこの定義を行います。
◆ 書式 : ユーザー名 ホスト名=(実行ユーザー名) コマンド
項目 |
説明 |
ユーザー名 |
コマンド実行を許可するユーザー名、またはグループ名、またはALL |
ホスト名 |
コマンド実行を許可するホスト名、またはIPアドレス、またはALL |
実行ユーザー名 |
コマンド実行時のユーザー、またはALL ( 省略時はroot ) |
コマンド |
実行を許可するコマンドのパス、またはALL |
NOPASSWD: |
NOPASSWD:を指定した場合、コマンド実行時にパスワードは問われない |
◆ 設定例 1 : 「mike」というユーザーに、全ての root 権限が必要なコマンドの実行を許可
◆ 設定例 2 : 「mike」というユーザーに、 root 権限が必要な全てのコマンドをパスワード入力なしに実行できることを許可
mike ALL=(ALL) NOPASSWD:ALL |
◆ 設定例 3 : 「mike」というユーザーに、shutdownコマンドの実行を許可
mike ALL=(ALL) /sbin/shutdown |
上記のように/etc/sudoersファイルで定義を行った後、sudoの引数として実行したいコマンドを指定します。
以下では「mike」に対して、本来はrootユーザーでしか実行できないshutdownコマンドを実行しています。
$ sudo /sbin/shutdown -h now
[sudo] password for mike: ← mikeユーザーのパスワードを入力
|
sudoコマンドで -l オプションを付けると、自分に許可されたコマンドを確認することができます。
$ sudo -l
User mike may run the following commands on this host:
(ALL) /sbin/shutdown
|
なお、SUIDやSGIDを使用した場合、一般ユーザーでも管理者権限でプログラムを実行することができます。
SUIDやSGIDが設定されているファイルが攻撃の対象になることもあるので、セキュリティ的によくないので
必要最低限に留める事が大切。なお、SUID、SGIDが設定されているファイルは以下コマンドで確認できます。
◆ 実行例 : SUIDが設定されているファイルを表示
◆ 実行例 : SGIDが設定されているファイルを表示
|