社外の研修に行ってきた。ハンズオンを伴った研修は初めて。午前中から午後1時間ほど、ハンズオン。ひたすら各自で課題の環境設定。その後、解説。10:00〜17:00。
環境は、VMware上のCentOS5.2を使用。つまりRedhat互換。apache、mysql、dns(bind)、mailのサービスを課題に沿って設定していく。apache、mysqlはセキュリティが“ざる”の状態で設定。dnsの設定でギブアップした。
以下、解説のメモ。
■OSセキュリティ概論
・OS内部のセキュリティモデル
-ファイル、ディレクトリのアクセス制御によってセキュリティを守る。
-グループ、ユーザ、オーナーなどの概念
(UNIX系)
-所有ユーザ、所有グループ、パーミッションで制御
-/etc/groupファイルのXフィールドはグループパスワードの設定フィールド
(Windows系)
-UNIX系より詳細。
-ACL:アクセスコントロールリストを使用して細かい制御が可能。セキュリティのチェック項目が詳細。
※Solarisなど一部のUNIXでは拡張で利用可能。
・OSに対するアクセス制御
-ポート単位のアクセス制御
-IPアドレス単位のアクセス制御
・何のために制御するか?
-明示的に設定することで制御。
-不要なポートの公開をしない。
→オペレーションミスを防ぐことができる。
デーモンを立ち上げてもポートが閉じていれば大丈夫。
・どうやって制御するか
-デーモン側での制御(tcp_wrapper、xinetd)
-ポートでの制御(iptables)
・デーモンでの制御
-tcp_wrapper
→inetd経由で起動するデーモンを制御
→/etc/hosts/allow、/etc/hosts/deny
→allowを先に見て判断、書いてなければdenyを見る
-xinetd
inetdの後継。設定+アクセス制御という機能
・ポートでの制御
-iptables
→設定順に評価する。
最後に全てのパケットを破棄する条件を書く。
先に許可するパケットの条件を書く。
・基本
-まず、全てを拒否する。それから許可するものを選ぶ。
※SELinuxは、ACLに近い話。通信の制御とはちょっと異なる。
■アプリケーション・セキュリティ
★必要最小限の権限を設定する。
・データベース(mysql)
-他のサーバがクラックされてもアクセス制御でデータベースサーバは助かる可能性が高くなる。
・Webサーバ(Apache)
-ユーザ権限が奪われたとしても、適切に設定していれば改ざんされない。
・基本
-デフォルト拒否!最小限の権限のみ設定する。
-最大限の権限を付与するとクラックされたときの被害が甚大。
・データベースサーバのアクセス元制御
-必要なホストからのアクセスのみ許可する。
1.bind-addressを使う方法
→/etc/my.cnfに記述する。
例) bind_address=127.0.0.1
サーバが複数IPを持つ場合、指定したアドレスでのみ待ちうけ。
厳密にはアクセス元制限とは異なる。
2./etc/hosts.allowを使う方法。
-ユーザ権限の制限
→参照専門のウェブアプリにはSELECT権限だけでよい。
→SQLインジェクションによるDDL文の実行を防ぐ。
→GRANT文の使用時に制限をかける。(user@localhostとするなど)
・Apacheのアクセス制御
-webページのアクセス制御
→アクセス元のIPアドレスを制限する。
→Directoryの設定で「Order allow,deny」としておく。
「allow from xx.xx.xx.xx」で許可するIPを指定。
-その他の制限
→エラーページにApacheのバージョン情報を表示させない。
※クラッカーに不要な情報を与えない。
httpd.confに「sigunature off」を追加する。
→cgiが実行されるディレクトリに対して、
apacheのオーナの書き込み権限は消しておく。
-r-xr-xr-x 1 http http
としておく。
→管理用ファイルには類推しにくいファイル名をつける。
例) admin.phpなどは避ける。
→不要なファイルは消しておく。
例) phpinfo();を記述したファイルは消しておく。
・ログ取得
-ログは嘘つかない。
-必要な情報を残すように設定する。
-どんどん溜まるので、ローテーションが必要。
-外部からアクセスさせない。
-内部ホストへの転送を考える。
・mysqlのログの種類
-エラーログ
-一般クエリログ
-スロークエリログ → 一定時間に終了しないクエリのログ。
-バイナリログ
-設定の確認
→ログの取得設定の確認
→外部からアクセスできない場所に出力するように設定したか。
・apacheのログの種類)
-httpd.conf
→Errorlog
→Customlog ※記述のときはcombinedをつけること。
→VirtualHostに記述するとログを分けることができる。
※ログローテーション
/etc/logrotate.d、/etc/logrotate.conf を参考にしてログのローテーションの計画をする。
■UNIX系OSのアクセス権限について
・シェルを持つユーザでサービス実行してはいけないのか?
→これは確かだが、最近のクラック手法に対して安全ではない。
→nologinでも安全ではない。※nologinというプログラムを実行する。
→アカウントの管理が重要。不要なアカウントは削除しておく。
・サービスが動く権限
→/etc/passwd、/etc/shadowは権限によって見え方が違う。
・Webコンテンツ転送にWebサービスアカウントを使ってはいけない?
→ウェブサービスアカウントでログインできることが問題。
→逆もだめ。個別のアカウントで区別して使用すること。
→FTPは望ましくない。
-暗号化されない。
-パスワード認証
-データ通信用セッションと制御用セッションが別。2本のセッションが必要になる。
→SSHを利用したSFTP、SCPなどが推奨。
★★必ずクライアント認証で利用すべき!!!★★★
パスワード認証は安全ではない。総当り攻撃でやられる。
■DNS
・設定による危険性
-不要な情報のアナウンス
-DNSキャッシュの不正保持
-キャッシュサーバになる・ならない
・SOAレコードの作成
-TTLは$TTL行で別に指定する。
-Negative TTLを必ず設定する。
・考えられる問題
-アドレス間違い
-期限切れで他人に取得される
-応答を返さない(DoS状態)
-キャッシュ汚染 →フィッシング詐欺に利用される
-キャッシュを持つ必要がある? →今回のハンズオンでは必要なし。
・キャッシュ汚染の対処
-DNSプロトコル
→問い合わせ/回答=UDP
→UDPはステートレスプロトコル。投げっぱなし。
→ソースアドレスを偽装して返す。
→TTLを短くしすぎると、キャッシュ再問い合わせ回数が増えて、汚染される確立が増える。
・ソースポート固定問題
-2008/7/9 DNSセキュリティアドバイザリ
query-source address * port *;
と書くことで対応。
■メール ※今回はメール送信サーバ
・不正中継を防止する。
・SMTP認証を行う。
・不要なVRFYコマンド、ETRNコマンドを停止する。
■時刻同期
・重要性 →ログなどのため。
・イントラネットのPCについて個別に外部サーバに聞きに行くのはNG。内部に1、2台NTPサーバを準備すれば足りる。