以下は, ネットワークに接続されている全てのホストに対して, 最低限必要だと思われるセキュリティ対策です. 「自分は電話で時々接続するだけだし, 珍しいものがコンピュータに入っているわけでも無いから, 大丈夫じゃない?」 という期待には, 何の根拠もありません. セキュリティでは常に相手(侵入者)の立場から考える事が必要です. したがって, 以下の対策をインストール直後, ネットワークに接続する前に 行うことをお勧めします. また, ここに掲載する対策は最低限必要なものです. これらの対策をとったから安全だ, とは言い切れません. しかし, 大抵のトラブルはドアに鍵をかけることで防げるのもまた事実です.
ここに紹介したほとんどの対策は, 実行に root 権限が必要です. ですから, 操作を間違えたらシステムに大きなダメージを与える可能性があります. ミスに備えて, 操作するファイルのバックアップなどが必要な場合も ありますが, そこまでの説明は書いてありません. ファイルの変更を伴うような操作では, 後戻りできるように考えながら 行いましょう.
インストールが終了し, 起動した時点でパスワードが設定されていないアカウントが存在する ディストリビューションがあります. 次の, パスワードに関する項目を参考に, ネットワークなどに接続するまえに全てのアカウントをチェックし, 必要に応じてパスワードを設定して下さい. パスワードを設定されていないユーザを検索するコマンドとして, たとえば次のようなものを実行すれば良いでしょう.
gawk -F: '{if ($2 !~ /./) print $1}' < /etc/passwd
shadow password を使っているシステムでは, 同様のコマンドを /etc/shadow でも実行してください. 上のコマンドにヒットしたユーザに関しては, パスワードを設定するか あるいはアカウントをロックする必要があります.
linuxconf プログラムが利用できるならば, これを使って アカウントのロックその他の管理ができます. Config → User accounts → Normal → User accounts を開いて, 適切な操作を行って下さい.
パスワードのファイルである /etc/passwd をエディタで直接操作することで, アカウントのロックなどの管理ができます. /etc/passwdの パスワードのフィールド( ":" で区切られた 2番目)に "*" (半角のアスタリスク) 一個をエディタなどで書き込めば, アカウントをロックすることができます. 下に挙げた例では, ユーザ "nobody" のアカウントがロックされています.
nobody:*:10652:0:99999:7::: ^これ
実際に使っているアカウントを壊してもアレですから, 自信が無い場合は, どうでもいいアカウントを作成するなどして実験してからやりましょう.
パスワードが認証に役立つのは, それがあなたの心の中だけに存在する場合に限られます. この条件を守るためには, 次のような事柄を心がけて下さい.
パスワードは, セキュリティの最終防衛ラインです どんな事があってもバレてはいけません. 「ひょっとしてバレたかな?」と思ったら, 直ちにパスワードを変更しましょう. パスワードの変更は, 次のコマンドです.
passwd [ユーザ名]
良いパスワードを作る方法は, 各個人の秘密に属する方法です. ここで公開するのは上に述べた原則に反しますが, あくまでもヒントとして一例を紹介しましょう. 次のコマンドはわりとランダムな文字列を生成します.
head -c 6 /dev/urandom | uuencode -
ゴロを思い付くなど憶えやすい文字列が出るまで, 何度か上のコマンドを実行しましょう. 7 が 3つ揃うまでやらないように.
多くの人は, 雑誌や書籍の付録や, 店頭で販売されている CD-ROM からインストールするでしょう. CD-ROM に収録されているプログラムは, どうしてもすこし古いものになってしまいます. 自分のインストールしたディストリビューションのサイトからアップデート情報を仕入れたり, プログラムの開発元のサイトを調べて, セキュリティ上の対策が施された最新のプログラムを使いましょう.
などはセキュリティ上の問題に関連して頻繁にアップグレードされますから, 特に注意が必要です. 様々なディストリビューションのサイトはこちら から. また, ネットワークサービス関連のサイトはこちら からどうぞ.
ネットワークサービスには, それを提供するホストから見た場合, 次の 2 種類があります.
1 の inetd を介して起動されるサービスに関しては, /etc/inetd.conf というファイルを編集することで, 設定を変更できます.
inetd.conf に書いてある設定のうち, 不要なものを, 行の先頭に "#" を挿入してコメントにしてください. 特に, systat, netstat, chargen, finger, discard を起動している行がコメントになっていない場合は, "#" を付けてコメントにしましょう. そして 編集が終った inetd.conf をセーブし, 次のコマンドを実行してください.
kill -1 `cat /var/run/inetd.pid`
inetd から起動されるサービスを, 全て tcpd を通すようにし, /etc/hosts.deny などを編集して アクセスに対する設定を行います. 以下の二つの条件が成立していれば, あなたの使っている設定では既に tcpd を使うようになっています.
例えば slackware や RedHat では, インストールされたままの状態で, すでに多くのサービスが tcpd を介して起動されるようになっていますから, 上の項目に関する操作は必要ありません. ファイアウォールなどを介さず, インターネットに直接接続されている場合は, 本当に必要なサービス以外全て停止した方が良いでしょう. たとえば, あなたの利用形態が, 一日に何度か電話等で接続して WWW や メールを使うというものならば, 全てのサービスを停止しても構いません.
tcpd で制御される全てのネットワークサービスに対する全てのリモートホストからのアクセスを無効にするには /etc/hosts.deny に ALL:ALL とだけ記述し, /etc/hosts.allow には何も記述しません.
この設定にするには, 例えば次のコマンドを実行してください.
echo ALL:ALL > /etc/hosts.deny echo > /etc/hosts.allow
必要なサービスだけを明示的に有効にするには, /etc/hosts.allow に緩和の条件を書きます. たとえば IPアドレス 192.168.1.xxx と自分自身からのみ telnet を許可する場合は, /etc/hosts.allow に次の1行を記述します.
in.telnetd : 192.168.1.0/255.255.255.0 127.0.0.1
詳しい設定方法については, tcpd や hosts_access のマニュアルなどをご覧下さい (手元でも man tcpd, man 5 hosts_access で見ることができます).
inetd を介さないサービスに関しても, インストール直後の状態では不要なサーバプロセスが立ち上がっている可能性があります. ps auxw, netstat -a などを行って, 不要なまたは動作の分からないサーバプロセスを調べ, /etc/rc.* などを編集し, OS 起動時に立ち上がらないようにします.
linuxconf コマンドが利用できれば, この項目に関しては, Control → Control panel → Control service activity から設定できます. UNIX は初めて, という人にはこちらの方がシステム初期化スクリプトを追いかけ慣れぬエディタを使って編集するよりも簡単で, 確実でしょう.
とくに, あなたのホストがメールサーバ,あるいはファイルサーバでない場合は sendmail と nfs を停止することを強くお勧めします (これらの用語の意味が判らない場合は, あなたのコンピュータはおそらくファイルサーバでもメールサーバでもないでしょう). これらのサービスは伝統的に, 数多くのセキュリティホールの温床となってきましたし, これからもそうありつづけるでしょう. nfs を停止するには rpc.nfsd と rpc.mountd という名前のプロセスを kill します. またこれらのプログラムを起動しているシステム初期化スクリプトの当該箇所の行の先頭に "#" を挿入してコメントにしてください.
また, 使っていない WWW サーバ(apache) も停止しましょう. WWW もまた, 数多くの不正アクセスの巣窟となっています. apache の停止はコマンド
apachectl stop
です. また, これらのサービスを使わない事が判っているのであれば, 停止した上で, いっそ削除してしまった方が安全です. とはいえ, Linux で apache が動いていないというのも悲しいので, できれば最新版をちゃんと設定して使ってあげて欲しいところです.
xdm を使えば, X Window System からの login も制限できます. 日常的に X を使うのであれば, まず, "startx" はやめて, xdm を使いましょう. tcpd を設定したら, 次は X のガードです.
xdm からの login の許可/不許可を設定するのは, Xaccess というファイルで, 通常 /usr/X11R6/lib/X11/xdm/ にあります. ファイルの詳しい書き方は xdm のマニュアルを参照して頂くとして, ここでは手っ取り早い処置だけを書きましょう. ローカルの xdm のログイン窓しか使わないのであれば, 全部の行を"#" で始まるコメントにしてしまい, xdm を runlevel を切替えるなどして再起動します. runlevel の切替えは次のコマンドです.
init [切替える runlevel]
インストール直後の状態では, 誰でも root になることができます. これをグループ [root] に所属するユーザのみ root になる権限を持つようにします. 方法は, /etc/group を編集して root 権限を与えたいユーザをグループ root に加え, /etc/login.defs の SU_WHEEL_ONLY の部分を yes にします. (この方法が使えない login パッケージも存在します)
インストール直後の状態では, どこからでも root で login することが可能です. これを console からのみ許可するようにするには, /etc/securetty から console と tty(N) (tty1, tty2 など) 以外の記述を消去します. 具体的には ttyp1 などを消すことになります (もしあれば, ですが).
最近のほとんどのディストリビューションでは, ユーザ認証のメカニズムとして Linux-PAM を用いています. その場合は /etc/pam.d/ 以下のファイルや /etc/pam.conf を編集し上述のような設定を行います.
たとえばグループ [root] に所属するユーザのみ root になれるようにするためには, /etc/pam.d/su に以下の行を追加します. すでにコメントとして記述されている場合は, 行頭の # を削除するだけで設定が有効になります.
auth required pam_wheel.so
また, リモートホストからの root での login を無効にするためには, /etc/pam.d/login に以下の行を追加します. すでにコメントとして記述されている場合は, 行頭の # を削除するだけで設定が有効になります.
auth requisite pam_securetty.so
その他にも /etc/pam.d/ 以下のファイルを編集することによって, さまざまな設定を行うことができます. 詳しくは pam のマニュアルや付属のドキュメント, 各種設定ファイルをお読み下さい.
ftp, telnet, rlogin, rsh, http, smtp, pop など, 主要なインターネットの 通信は, ユーザ名, パスワード, 通信内容を含めて全てが容易に盗聴可能です. 例えば, telnet 先で root に su したのを盗聴されたら, 一撃で陥落です. ssh, openssh, SSLTelnet, OTP などを導入する事により, パスワードや交信の内容を第三者に盗み見される可能性を 少なくすることができます. また, ssh には telnet に無い便利な機能が沢山あるので, インストールしたら, さっさと telnet をお払い箱にしてしまいましょう.
ただし, ssh などの高度な暗号プログラムを正しく利用するためには, その技術的な背景をある程度理解する必要があります. 付属の文書をよく読みましょう. たとえば, telnet 先で ssh を使っても通常何の意味もありませんが, それが解らないまま ssh を使っても, セキュリティは全く向上しません.
以上のようなことが一通りできれば, その後何もしなくてもずっと OK, というわけではありません. 新たなセキュリティホールが必ず見つかるからです. 新しいプログラムを使う という項目でも書きましたが, 定期的に www.linux.or.jp や CERT などの Web Site をご覧になり, セキュリティ情報をチェックすることをお勧めします. CERT などには, セキュリティ情報を配信するメールリングリストもあり, 大変重宝します.
これは「はじめの一歩」ではカバーしきれない事態ですから, 簡単に紹介するに留めます. まず, 被害の拡大を防ぐため, ネットワークケーブルを取り外します. "ifconfig eth0 down" などは, てぬるいのでダメです. ifconfig コマンドが置き換えられているかも知れないからです(なんてこった!). それから,
などの段階を辿ることになります. めんどくさいですね. 転ばぬ先のセキュリティですよ.