niwacchi.log

niwacchiのログ。

12/4の研修メモ

 社外の研修に行ってきた。ハンズオンを伴った研修は初めて。午前中から午後1時間ほど、ハンズオン。ひたすら各自で課題の環境設定。その後、解説。10:00〜17:00。

 環境は、VMware上のCentOS5.2を使用。つまりRedhat互換。apachemysqldns(bind)、mailのサービスを課題に沿って設定していく。apachemysqlはセキュリティが“ざる”の状態で設定。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サーバを準備すれば足りる。

■その他
※rsshの利用。
※公開キーはputtyGUIを使うなどで簡略化。