ホスト上には、プログラムを実行するファイルや設定ファイルなど、多くのファイルが存在します。これらの中には、第三者に見せてはいけない重要なファイルも多数あります。ファイルのパーミッションが適切に設定されていないと、これらのファイルが読まれてしまったり、書き換えられてしまいます。
すべてのユーザーに対して、すべてのファイルの読み出しや書き込みを許可する必要はありません。環境に合わせて適切なパーミッションを設定しましょう。
最初に、ファイルのパーミッションとは何かについて簡単に説明します。試しに、次のコマンドを実行してみてください。
# ls -l test -rwxrw-r-- root root 0 Aug 31 19:00 test
先頭の1文字を除いたrwxrw-r--がこのファイルのパーミッションを示しています。パーミッションとは、ファイルに対するアクセスの種類を示すビット列です。
最初の3文字は所有者のアクセス権、次の3文字が所有グループのアクセス権、最後の3文字がそのほかのユーザーのアクセス権を示しています。つまり、合計9文字でファイルのアクセス権が表現されているのです。
r、w、x、-には次のような意味があります。
r | 読み取り権 |
---|---|
w | 書き込み権 |
x | 実行権 |
- | 権限なし |
表2 パーミッションの文字の意味 |
rwxrw-r--では、次のようなアクセス権があることを意味します。
ログファイルや各種アプリケーションの設定ファイルに、一般ユーザーの書き込み権限を与える必要はありません。もし書き込み権があるなら、パーミッションを変更してください。この作業には、chmodコマンドを使います。
chmodコマンドを使うためには、アクセス権の指定方法を知る必要があります。アクセス権を設定するには、演算子を使う方法と8進数を用いる方法があります。
演算子 | |
---|---|
+ | アクセス権を追加 |
- | アクセス権を削除 |
= | アクセス権を割り当てる |
文字 | |
u | ファイルの所有者 |
g | ファイルの所有グループ |
o | そのほかのユーザー |
8進数 | |
0 | アクセス権なし |
1 | 実行 |
2 | 書き込み |
3 | 実行、書き込み |
4 | 読み取り |
5 | 実行、読み取り |
6 | 書き込み、読み取り |
7 | 実行、書き込み、読み取り |
表3 chmodコマンドの引数 |
ファイルtestの所有グループから書き込み権を削除するようにパーミッションを変更するには、以下のようにします。
# chmod g-w test
今度は、以下の2つの条件を満たすようにパーミッションを変更する方法です。
# chmod 644 test
これまでは、ファイルtestのパーミッション部分についてのみを解説していて、-rwxrw-r--の先頭の文字には触れていませんでした。しかし、もちろん先頭の文字にも意味があります。先頭の文字は、ファイルなのかディレクトリなのかを表しています。ここに使われる文字には、以下のような意味があります。
- | ファイル |
---|---|
b | ブロック特殊ファイル |
c | キャラクタ特殊ファイル |
d | ディレクトリ |
l | シンボリックリンクファイル |
表4 先頭文字の意味 |
ファイルのパーミッションに「s」という文字が付いているファイルが存在します。これはSUID、SGIDされたファイルであることを意味します。例を見てみましょう。
# ls -l /bin/ping -rwsr-xr-x 1 root root 22620
これは、所有者rootにSUIDされたファイルであることを意味します。
# ls -l /usr/bin/man -rwxr-sr-x 1 root man 35676
これは、所有グループmanにSGIDされたファイルであることを意味します。
SUID/SGIDが設定されているファイルは潜在的な危険性を持っています。SUID/SGIDが設定されたファイルは、所有者以外のアカウントで実行されても所有者/所有グループが実行したことになります。つまり、SUID rootが設定されているファイルは、一般ユーザーでもrootとして実行したのと同じになります。これはセキュリティホールとなる可能性があります。
SUID/SGIDされているからといって、必ずしも変更しなければならないというわけではありません。しかしながら、SUIDされたファイルが新たにできていないかを定期的に確認することをお勧めします。SUID/SGIDが設定されたファイルを見つけるには、以下のコマンドを実行します。なお、SUIDとSGIDを8進数で表すと、それぞれ2000と4000になります。
# find / -perm +4000
# find / -perm +2000
SUID/SGIDチェック用のスクリプトを作成し、cronに登録して定期的に確認するようにしましょう。新たにファイルが見つかったら、管理者に通知するような仕組みにしておくと便利です。同様に、.rhostsなどができていないかどうかも確認した方がいいでしょう。
sudoを使用することで、実行に高い権限が必要なプログラムを特定のユーザーのみが使用するように制限できます。sudoはログに残すことが可能なので、どのユーザーがsudoコマンドを使ってコマンドを実行したかを監査することができます。 例として、ユーザーuserのみがpingを実行できるように設定します(rootは当然実行できます)。 まず、pingのSUIDを外します。
# chmod -s /bin/ping
/etc/sudoersを編集します。編集にはvisudoコマンドを使います。
# visudo
/etc/sudoersに以下の2行を追加します。
user localhost=NOPASSWD: /bin/ping Defaults syslog=auth, logfile=/var/log/sudo.log
touchコマンドで、sudo用ログファイル/var/log/sudo.logを作成します。
# touch /var/log/sudo.log
Red Hat Linux 7.1Jで新規にファイルを作成すると、デフォルトのパーミッションは一般ユーザーの場合が664、rootの場合が644になります。これは、touchコマンドで空のファイルを作成することで確認できます。
$ touch test1 $ ls -l -rw-rw-r-- 1 user user 0 Aug 31 19:00 $ su - Password: # touch test2 -rw-r--r-- 1 root root 0 Aug 31 19:00
デフォルトのパーミッションはもっと厳しく設定しましょう。umask値を設定すると、ファイルのデフォルトパーミッションを決めることができます。
umask値は、「666から与えたいパーミッションを引いた値」を指定します。rootアカウントで作成したファイルには、rootアカウントのみに書き込み、読み取り権を与えるべきでしょう。つまり、デフォルトのパーミッションを「600」にするわけです。すると、
666−600=066
となり、umask値は066になります。
Red Hat Linux 7.1Jでは、/etc/profileでumask値を設定します。viなどで/etc/profileを開き、下記のようにumask値を修正してください(編注)。
ulimit -S -c 1000000 > /dev/null 2>&1 if [ `id -gn` = `id -un` -a `id -u` -gt 14 ]; then umask 022 ←この部分を002から変更 else umask 066 ←この部分を022から変更
アカウント(シェルはbashとする)が複数存在し、アカウントごとにumask値を設定したい場合は、各アカウントのホームディレクトリにある.bash_profileの最後に以下の1行を追加してください。
# vi /root/.bash_profile umask 066 ←umask値は任意
以上で、ホストレベルのセキュリティ対策の解説は終わりです。しかしながら、これがすべてというわけではありません。セキュリティ対策に「絶対」や「終わり」はありません。いかにそれらに近づけるかがとても重要です。
今回設定方法を紹介したxinetdは、すでに不具合が発見されています。繰り返しますが、最新のものを導入してください。しかしながら、最新だからといって必ずしも不具合がないとはいえませんし、しかるべき設定を行ったからといって絶対に安全とはいえません。セキュリティ情報を常に追いかけ、情報収集を行うこともセキュリティ対策の1つといえるのではないかと思います。
次回予告
次回は、Linuxのカーネルの機能を利用したファイアウォールの構築方法を解説します。掲載は10月中旬の予定です。
Copyright © ITmedia, Inc. All Rights Reserved.