連載
» 2001年09月18日 00時00分 公開

ホストレベルセキュリティの総仕上げゼロから始めるLinuxセキュリティ(2)(3/3 ページ)

[大貫大輔,株式会社ラック/不正アクセス対策事業本部]
前のページへ 1|2|3       

ファイルシステムに関するセキュリティ対策

 ホスト上には、プログラムを実行するファイルや設定ファイルなど、多くのファイルが存在します。これらの中には、第三者に見せてはいけない重要なファイルも多数あります。ファイルのパーミッションが適切に設定されていないと、これらのファイルが読まれてしまったり、書き換えられてしまいます。

 すべてのユーザーに対して、すべてのファイルの読み出しや書き込みを許可する必要はありません。環境に合わせて適切なパーミッションを設定しましょう。

ファイルのパーミッションとは

 最初に、ファイルのパーミッションとは何かについて簡単に説明します。試しに、次のコマンドを実行してみてください。

# ls -l test
-rwxrw-r--  root  root   0   Aug  31  19:00  test
注:testはファイル名

 先頭の1文字を除いたrwxrw-r--がこのファイルのパーミッションを示しています。パーミッションとは、ファイルに対するアクセスの種類を示すビット列です。

 最初の3文字は所有者のアクセス権、次の3文字が所有グループのアクセス権、最後の3文字がそのほかのユーザーのアクセス権を示しています。つまり、合計9文字でファイルのアクセス権が表現されているのです。

 r、w、x、-には次のような意味があります。

r 読み取り権
w 書き込み権
x 実行権
- 権限なし
表2 パーミッションの文字の意味

 rwxrw-r--では、次のようなアクセス権があることを意味します。

  • ユーザーが所有者(root)の場合、読み取り(r)、書き込み(w)、実行(x)が可能
  • ユーザーがファイルの所有グループ(root)に属している場合、読み取り(r)、書き込み(w)が可能
  • そのほかのユーザーの場合、読み取り(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 先頭文字の意味

SUID/SGIDファイルの意味と危険性

 ファイルのパーミッションに「s」という文字が付いているファイルが存在します。これはSUIDSGIDされたファイルであることを意味します。例を見てみましょう。

# 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
SUIDの場合
# find / -perm +2000
SGIDの場合

 SUID/SGIDチェック用のスクリプトを作成し、cronに登録して定期的に確認するようにしましょう。新たにファイルが見つかったら、管理者に通知するような仕組みにしておくと便利です。同様に、.rhostsなどができていないかどうかも確認した方がいいでしょう。

コラム:sudoによる制限の活用

 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

umask値によるデフォルトパーミッション

  Red Hat Linux 7.1Jで新規にファイルを作成すると、デフォルトのパーミッションは一般ユーザーの場合が664rootの場合が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から変更
編注:一般的なUNIXの一般ユーザーumaskは022だが、Red HatではUPG(User Private Groups)により002としている。UPGについては、以下のURLを参照。http://www.redhat.com/docs/manuals/linux/RHL-7.1-Manual/ref-guide/s1-users-groups-private-groups.html

 アカウント(シェルはbashとする)が複数存在し、アカウントごとにumask値を設定したい場合は、各アカウントのホームディレクトリにある.bash_profileの最後に以下の1行を追加してください。

# vi /root/.bash_profile
umask 066 ←umask値は任意
注:導入したアプリケーションのログを取り、そのログをローテーションさせているのであれば、スクリプト内にumask値を設定するか、新しく生成されるログファイルのパーミッションをrootのみが読み書きできるように設定してください。


 以上で、ホストレベルのセキュリティ対策の解説は終わりです。しかしながら、これがすべてというわけではありません。セキュリティ対策に「絶対」や「終わり」はありません。いかにそれらに近づけるかがとても重要です。

 今回設定方法を紹介したxinetdは、すでに不具合が発見されています。繰り返しますが、最新のものを導入してください。しかしながら、最新だからといって必ずしも不具合がないとはいえませんし、しかるべき設定を行ったからといって絶対に安全とはいえません。セキュリティ情報を常に追いかけ、情報収集を行うこともセキュリティ対策の1つといえるのではないかと思います。

次回予告

次回は、Linuxのカーネルの機能を利用したファイアウォールの構築方法を解説します。掲載は10月中旬の予定です。



前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。