Copyright(C) 2008 HIDEKAZU@kimagure All Rights Reserved.
Linux サーバ
パーフェクトセキュリティ
Linux サーバ パーフェクトセキュリティ から抜粋- 2 -
== 目 次 ==
Ⅰ.ネットワークのセキュリティ
Ⅰ-ⅰ.Ping の要求を受け取らない
Ⅰ-ⅱ.Ping に応答しない
Ⅰ-ⅲ.traceroute への制限
Ⅰ-ⅳ.SmurfDoS 攻撃の中継地点をとらない
Ⅰ-ⅴ.SYN Flood 攻撃への対応
Ⅱ.インターネットサーバ共通のセキュリティ
Ⅱ-ⅰ.不要サービスを停止する
Ⅱ-ⅱ.kill コマンドによるサービス停止
Ⅱ-ⅲ./etc/services ファイルでサービスを無効にする
Ⅱ-ⅳ.service コマンドでサービス停止
Ⅱ-ⅴ.サービスの自動起動の設定
Ⅱ-ⅵ.linuxconf でサービスの起動や停止を設定
Ⅱ-ⅶ.ntsysv コマンドでサービスの自動起動を設定
Ⅲ.リモートコマンドを制限する
Ⅲ-ⅰ.r 系コマンドを制限する
Ⅲ-ⅱ.telnet の制限を行う
Ⅲ-ⅲ.SSH を使えるようにする
Ⅲ-ⅳ.rpm コマンドの使い方
Ⅳ.サーバのログ設定
Ⅳ-ⅰ.サーバのログ設定(SYSLOG とその他のログ)
Ⅳ-ⅱ.SYSLOG の設定
Ⅴ.Web サーバのセキュリティ
Ⅴ-ⅰ.Apache 設定ファイル httpd.conf
Ⅴ-ⅱ.httpd.conf による設定
Ⅴ-ⅲ.Web サーバへのアクセスコントロール
Ⅴ-ⅳ.他の Web サーバセキュリティ設定
Ⅵ.FTP サーバのセキュリティ
Ⅵ-ⅰ.FTP サーバの ACL 設定を行う
Ⅵ-ⅱ.匿名 FTP サービス
- 3 -
Linux サーバセキュリティ
Ⅰ. ネットワークのセキュリティ
[47] Ⅰ-ⅰ. Ping の要求を受け取らない [51] 設定値 -内部ネットワーク:192.168.117.0/24 -管理マシン :192.168.117.10 ①ネットワークに対する Ping 要求をすべて破棄する# iptables –A INPUT –p icmp –-icmp-type 0 –s 0.0.0.0 –d 192.168.117.0 –j DROP
②ネットワークに対する Ping 要求を管理マシンにのみ許可する
# iptables –A INPUT –p icmp –-icmp-type 0 –s 192.168.117.10 –d 192.168.117.0 –j ACCEPT
Ⅰ-ⅱ. Ping に応答しない [52] 設定値 –同じ
①Ping 要求に対する応答をすべて破棄する
# iptables –A OUTPUT –p icmp --icmp-type 8 –s 192.168.117.0 –d 0.0.0.0 –j DROP
②管理マシンからの Ping 要求に対し応答する
# iptables –A OUTPUT –p icmp --icmp-type 8 –s 192.168.117.0 –d 192.168.117.10 –j ACCEPT
Ⅰ-ⅲ. traceroute への制限 [54] 設定値 –同じ
# iptables –A OUTPUT –p icmp --icmp-type 11 –s 192.168.117.0 –d 0.0.0.0 –j DROP # iptables –A OUTPUT –p icmp --icmp-type 11 –s 192.168.117.0 –d 192.168.117.10 –j ACCEPT
Ⅰ-ⅳ. Smurf DoS 攻撃の中継地点をとらない [68] 設定値
- 内部ネットワーク:192.168.117.0/24 - 外部向けインタフェース:eth0 ①送信先指定
# iptables –A INPUT –d 0.0.0.0/8 –i eth0 –j DROP
# iptables –A INPUT –d 255.255.255.255/32 –i eth0 –j DROP
0.0.0.0/8 , 255.255.255.255/32 → Smurf DoS 攻撃によく使われる。
②送信元指定
# iptables –A INPUT –s 192.168.117.0/24 –i eth0 –j DROP
塞いだ方が好ましいアドレス一覧
・0.0.0.0/8 : Historical Broadcast ・192.168.0.0/16 : RFC 1918 Private Network ・10.0.0.0/8 : RFC 1918 Private Network ・224.0.0.0/4 : Class D Multicast
・127.0.0.0/8 : Loopback ・240.0.0.0/5 : Class E Reserved ・169.254.0.0/16 : Link Local Networks ・248.0.0.0/5 : Unallocated ・172.16.0.0/12 : RFC 1918 Private Network ・255.255.255.255/32 : Broadcast
- 4 - ・192.0.2.0/24 : TEST-NET
Ⅰ-ⅴ. SYN Flood 攻撃への対応 [69] ①TCP FIN スキャンの防止
1) SYN/FIN フラッグを立てたパケットを破棄
# iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -s
>> 0.0.0.0 -d 192.168.117.0/24 -j DROP
2) FIN フラッグを立てたパケットを破棄
# iptables -A INPUT -p tcp --tcp-flags ALL FIN –s
>> 0.0.0.0 -d 192.168.117.0/24 -j DROP
②TCP Xmas ツリースキャンの防止
・FIN/URG/USH フラッグを立てたパケットを破棄
# iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PUSH >> -s 0.0.0.0 -d 192.168.117.0/24 -j DROP
Ⅱ. インターネットサーバ共通のセキュリティ
[71]Ⅱ-ⅰ. 不要サービスを停止する [84] ①停止する候補となるサービス [85]
サービス名 機 能
apmd APM を監視するデーモン。電源を ON/OFF した時に SYSLOG に残したり、管理者 へ警告を通知できる。 atd at によってキューに入られたジョブを実行する。 canna かな漢字変換サーバ。日本語入力を行わないなら必要ない。 lpd ラインプリンタデーモン netfs NFS マウントポイントのマウント・アンマウントを有効にする。 portmap NFS や NIS など、RPC を使用したプログラムに必要。 ②停止することを推奨するスーパーデーモン経由で起動するサービス [85] サービス名 機 能 finger ホスト内にあるユーザの情報を提示 daytime 日付と時刻を応答する chargen 文字列に対し応答する time 日付と時刻を応答する shell 起動しているだけでセキュリティホールとなり得るので停止 login 起動しているだけでセキュリティホールとなり得るので停止 talk talk コマンドのサーバ ③不要サービスを停止する方法 [86] 1) ポートを閉じる /etc/servicesを編集する 2) 動作しているプロセスを停止する
- 5 -
kill, service コマンドを使う , linuxconf で設定 3) 起動時にプロセスが立ち上がらないようにする 起動スクリプトの変更 , chkconfig コマンドで設定 , linuxconf で設定 Ⅱ-ⅱ. kill コマンドによるサービス停止 [86] 書式:kill コマンド ・kill [-s シグナル] [-p] [-a] プロセス ・kill -l シグナル番号 ①オプションの意味 [87] オプション 意 味 -s シグナル 指定したシグナルを送る。シグナルは番号もしくは名前で指定 -p プロセスの PID(プロセス ID)を表示する。シグナルは送らない -a コマンド名から PID への制限をはずす -l 指定されたシグナルの名前を表示する。シグナル番号を表示しなければ一覧を表示する。 ②よく使われるシグナル [87] 番号 シグナル名 省略名 意 味 1 SIGHUP HUP プロセスを再起動 2 SIGINT INT プロセスを中断 9 SIGKILL KILL プロセスを強制切断 15 SIGTERM TERM このシグナルを受け取らないプロセスを切断 18 SIGCONT CONT 停止状態のプロセスを再開 19 SIGSTOP STOP プロセスを停止状態にする ③プロセスの指定方法 [88] ・<PID> :その PID のプロセスにシグナルを送る ・ 0 :全てのプロセスにシグナルを送る ・ -1 :PID が1より大きい全てのプロセスにシグナルを送る ・-<PID> :指定した PID に属する全てのプロセスグループにシグナルを送る この場合、省略指定されたシグナルと誤解される可能性がある ・<コマンド名> :この名前で起動された全てのプロセスにシグナルを送る ④確認 [89] ps コマンドで確認 # ps-ax Ⅱ-ⅲ. /etc/services ファイルでサービスを無効にする [89] /etc/servicesファイル → サービスとポートの対応を記載 不要なサービスの無効化 ↓ 対象のサービスの行頭に「#」をつけてコメントアウトする。
Ⅱ-ⅳ. service コマンドでサービス停止(RedHat Linux) [90] 書式:service コマンド
- 6 - service サービススクリプト 動作 ①サービススクリプト[91] = 自動起動のスクリプト名 /etc/init.dディレクトリ(/etc/rc.d/init.dディレクトリ)にある ・スクリプトファイル一覧の表示 # ls /etc/init.d ②動作[91] ・start : 開始 ・stop : 停止 ・restart : 再起動
例) # service syslog start
Ⅱ-ⅴ. サービスの自動起動の設定[92] ① rc スクリプト[92] 1) ランレベル ・ランレベル 0 : 電源を切ることのできる状態 ・ランレベル 1 : シングルユーザーモード ・ランレベル 2 : マルチユーザーモード(NGS などは使わない) ・ランレベル 3 : マルチユーザーモード(規定) ・ランレベル 4 : 未使用 ・ランレベル 5 : X11 ・ランレベル 6 : リブート 2) 実行されるスクリプト 各ランレベルで起動する際に実行されるスクリプト → /etc/rc.dの下のそれぞれのランレベルに対応した rc0.d~rc6.d の各ディレクトリに格納 例) rc3.d ディレクトリ内リンクファイル名一覧 # ls /etc/rc.d/rc3.d 3) リンクファイル名 [1]先頭にあるアルファベット ・K :不要なデーモンを停止する ・S :デーモンを起動する 「K」を起動 → 「S」を起動 [2]アルファベットの後ろの数字 それぞれの中での起動順序 起動順序を間違うとエラーとなる可能性がある
②chkconfig コマンド (RedHat Linux7.3 以降)[93] 書式:chkconfig コマンド
chkconfig スクリプト名 on/off 例 1) httpd を自動起動させない
- 7 - 例 2) ランレベルごと(2~5)の設定
# chkconfig --level=2345 httpd off
例 3) 現在のデーモンの各ランレベルの起動設定の状態を確認
# chkconfig --list
Ⅱ-ⅵ. linuxconf でサービスの起動や停止を設定 [94] ①linuxconf の起動
# linuxconf
起動したら、「Control」のツリーを開き、「Control service activity」を選択
②「service control」画面 ・起動時に実行されるサービス :Enable 項目 → 「Automatic」 ・現在起動中のサービス :Running 項目 → 「Running」 ③サービスの変更 1) 変更するサービスを選択し、Enter 2) 設定画面 ・Startup :自動起動を行うかどうかの設定。 カーソルを合わせてスペースキーで変更する。 ・Status :現在実行中かどうかを表示する。 ・Package name :パッケージマネージャがインストールされていれば名前が表示される。 ・Description :このサービスの説明
Ⅱ-ⅶ. ntsysv コマンドでサービスの自動起動を設定 (Red Hat Linux) [97] ① ntsysv の起動 # ntsysv [ ]内にチェック → Linux 起動時に自動起動
Ⅲ.リモートコマンドを制限する
[98] Ⅲ-ⅰ. r 系コマンドを制限する [100] 「r」…リモート rlogin , rsh , rexec → サーバを直接制御できる ①xinetd の場合 /etc/xinetd.conf もしくは /etc/xinetd.d ディレクトリのファイルで設定 1) ls コマンドで確認 2) 停止したいサービスのファイルを編集 「disable」項目:[no]→[yes] もしくは ファイル名自体を変更 3) xinetd を再起動 ②PAM の認証を行わない [101] /etc/pam.dディレクトリ → r 系コマンドのための認証設定がある- 8 - ↓ ディレクトリ内に認証設定がないサービスであれば、PAM は other を適用 ↓ すべて拒否 → r 系コマンドの認証は other にまかせる <他の方法> rlogin , rsh , rexec のファイル名を変更 # mv /etc/pam.d/rlogin /etc/oam.d/_rlogin Ⅲ-ⅱ. Telnet の制御を行う [102] ①ログインメッセージの制御 ウェルカムメッセージの内容 → /etc/issue.net ↓ OS 名やバージョン名の記述をコメントアウト ※コンソールからのログインに対するメッセージ → /etc/issue ②Telnet ポートを変更する [103] Telnet ポート → 23 (規定) <変更手順> 1) /etc/servicesを修正 telnet 23/tcp → telnet 1023/tcp 2) /etc/servicesを保存 3) xinetd を再起動 ◎Telnet 接続の変更 ポートを変更した場合、接続時にポート番号を指定 # telnet 192.168.117.10 1023 ③root でログインさせない [103] 1) root でログインできる端末 → /etc/securettyに記述された端末 ↓ ttyp0~ttyp2 が Telnet 端末 …削除 2) /etc/pam.d/login内の行
auth reguired /lib/security/pam_securetty.so
この記述がなければ追加
④ root になれるユーザを制限する
1) root になれるユーザを所属させるグループを編集 [1] /etc/groupファイルを開く
[2] 「wheel」の行に、root になれるユーザを追加する
例:wheel:x:10:root, taro, hanako
2) /etc/pam.d/suファイル (su コマンド認証ファイル) 次の行を追加
auth reguired /lib/security/pam_wheel.so use_uid group=wheel
- 9 - 保存した直後から有効 Ⅲ-ⅲ. SSH を使えるようにする [105] ①認証鍵の作成 [105] 作成はログインユーザごとに行う 1) # su taro $ ssh-keygen –t rsa1
Generating public/private rsa1 key pair.
Enter file in which to save the key (/home/taro/.ssh/identity):
鍵を作成するディレクトリ。変更の必要がなければ Enter
Created directory ‘/home/taro/.ssh’.
Enter passphrase (empty for no passphrase) : パスフレーズを入力
Enter same passphrase again: 確認のためもう一度入力
Your identification has been saved in /home/taro/.ssh/identity. Your public key has been saved in /home/taro/.ssh/identity.pub. The key fingerprint is :
d5:54:f5:b4:ab:9e:d7:46:2b:f2:53:36:cf:3b:f7:5d raro@rhs 2) 確認 $ cd /home/taro.ssh $ ls identity identity.pub 3) ダウンロード 作成された秘密鍵(identity)と公開鍵(identity.pub)のうち、秘密鍵をリモートアクセスする端末にダウンロード ②接続制限を行う [106] 1) OpenSSH が標準インストールされている場合 → TCPWrapper による接続制限ができる 2) SSH に対するすべての接続を拒否 /etc/hosts.deny ファイル ssh : All 3) 許可するホストまたはネットワークを記述 /etc/hosts.allow ファイル ssh : 192.168.117.0/255.255.255.0 ③ユーザの制限 [107] /etc/ssh/sshd_config → ユーザ制限 1) ルートでログインさせない PermitRootLogin no 2) ユーザごとの接続制限 (拒否優先) 「AllowUsers」 → 許可 「DenyUsers」 → 拒否 拒否優先の場合、 AllowUsers に許可するユーザ名を記述する 例:「taro」と「hanako」を許可する場合
- 10 -
AllowUsers taro hanako (複数の場合スペースで区切る)
④ログの設定 [107]
・SSH のログは SYSLOG で記録
・/etc/ssh/sshd_config ファイル内の項目で Facility と Priority を設定
syslogFacility AUTHPRIV LogLevel INFO ・記録ファイル → /etc/syslog.confで設定 [120] Ⅳ-ⅳ rpm コマンドの使い方 ①パッケージの検索 書式:指定したパッケージがインストールされているか検索 rpm –q パッケージ名 パッケージ名 → 正式な名前 → 不明なことが多くあまり使われない 書式:grep コマンドと組合せて検索 rpm –qa | grep 探したい名前 書式:パッケージの中身を確認 rpm –ql パッケージ名 ②パッケージのアップデート 書式:インストール chkconfig スクリプト名 on/off 書式:アンインストール chkconfig スクリプト名 on/off 書式:アップグレード chkconfig スクリプト名 on/off -F オプション :以前のバージョンがなければアップグレードしない -U オプション :既存ファイルを上書きし、不要ファイルを削除 以前のバージョンがなければ新規インストールする Ⅳ-ⅴ. サーバのログ設定 (SYSLOG とその他のログ) ①SYSLOG UNIX 系 OS に標準装備されているログ記録システム 1) SYSLOG にログ記録を要求するアプリケーションが送信する項目 ・プログラム名 ・Facility ・Priority ・ログメッセージ 2) 設定ファイル /etc/syslog.conf
- 11 - ②その他のログ
/var/log ディレクトリ
内 1) 一覧を見る # ls /var/log 2) 代表的なログ ・lastlog :ユーザが最後にログインした記録。lastlog コマンドで閲覧 ・wtmp :ログイン履歴。last コマンドで閲覧 ・dmesg :ブート時のメッセージ記録 ・xferlog :FTP サーバのファイル移動ログⅣ-ⅵ. SYSLOG の設定
[120] 書式:/etc/syslog.conf の記述 Facility.Priority 出力先 ①Facility の項目 [120] 名 前 意 味 kern カーネル user 通常のユーザプロセス mail メール・サブシステム ftp FTP デーモン lqr ラインプリンタ・サブシステム auth 認証システム(非推奨、authpriv を推奨) authpriv 認証システムcron クロックデーモン (cron と at) deamon システムデーモン news NEWS サブシステム uucp UUCP サブシステム syslog syslogd の内部メッセージ local 1~7 サイト固有の使用のため予約 mark タイムスタンプ * mark を除くすべての Facility ②Priority の項目 [121] (上から優先順位の高い順) 名 前 意 味 emerg 緊急事態メッセージを通常すべてのユーザに通知 alert 緊急に修正する状態のメッセージ crit 致命的な状態のメッセージ err 通常のエラーメッセージ warning 警告メッセージ
- 12 - notice 特別な処理が必要なメッセージ info 情報メッセージ debug デバッグメッセージ * すべての Priority none (特殊) Facility を除外する ③出力先 ・ファイルまたはデバイス (絶対パス指定) ・他のマシンの syslogd (@hostname で指定) ・ユーザ (ただしログイン中のユーザ。「*」でログイン中の全ユーザ)
Ⅴ.Web サーバのセキュリティ
[123]Ⅴ-ⅰ. Apache 設定ファイル httpd.conf
[126] ①httpd.conf Apache の設定ファイル/etc/httpd/conf
もしくは/usr/local/apache/conf
に存在 1) 「ディレクティブ」 httpd.conf で記述する設定項目のこと [1] Apache サーバプロセスの全般的な制御(環境設定)を行うディレクティブ [2] メインサーバのパラメータ指定を行うディレクティブ [3] バーチャルホスト別のパラメータ指定を行うディレクティブⅤ-ⅱ. httpd.conf による設定
[128] ①実行ユーザの権限を制限する [128] 「User」,「Group」ディレクティブ → Apache を実行できるユーザやグループの設定 一般的には[nobody]が設定値 1)/etc/passwd ファイル
nobody の行を修正して nobody でログインできない設定にする nobody:x:99:99:Nobody:/:/sbin/nologin 2) su コマンドで nobody が root になれない設定にする P104 の方法による 3)/etc/group ファイル
グループ「wheel」を作成 root になれるユーザを追加 wheel:x:10:root nobody は記述しない 4)/etc/pam.d/su ファイル
su コマンドの認証ファイル コメントアウトをはずし、最後の行に「group=wheel」を追加- 13 -
aauth required /lib/security/pam_wheel.so use_uid group=wheel
②ドキュメントルートのパーミッション設定 [129] 「DocumentRoot」ディレクティブ → ドキュメントルートの設定 DocumentRoot “/usr/local/apache/htdocs” ③INDEX OF ~ の制限 (1) [130] Web ブラウザにインデックス表示させない → ドキュメントルートディレクトリのパーミッション変更 # chmod 311 /usr/local/apache/htdocs ファイル名を指定しないアクセス → 「Foribidden」と表示 ④INDEX OF ~ の制限 (2) [130] httpd.conf を設定 1) インデックスファイルを明示する方法 「DirectoryIndex」ディレクティブ → 指定したファイルをインデックスファイルとする 2) インデックスを表示したくないディレクトリの「Option」ディレクティブから Index の設定を削除する方法 httpd.conf の<Directory “/usr/local/apache/htdocs”>セクションを変更
Option Indexes FollowSymLinks MultiViews ↓
# Option Indexes FollowSymLinks MultiViews Option FollowSymLinks MultiViews
3) 「IndexIgnore」ディレクティブでインデックス表示したくないファイルを指定する方法 全てのファイルを表示したくない場合 IndexIgnore * ※httpd.conf の設定変更後は Apache の再起動を行う ⑤HTTP ヘッダ情報を制限する [132] サーバアプリケーションのバージョン情報などを隠す → 「ServerSignature」ディレクティブを変更 「ServerTokens」ディレクティブを追加 ServerSignature On ↓ ServerSignature Off
ServerTokens ProductOnly
※この設定は Apache1.3.12 以降に限る⑥エラーメッセージを制御する [133]
Apache がエラーを返す時に表示されるページを変更 → 「ErrorDocument」ディレクティブを変更 書式:ErrorDocument ディレクティブの指定
- 14 - 1) 代表的なステータスコードのエラー ステータスコード 意 味 401 Unauthorized 403 Forbidden 404 Not Found
500 Internal Server Error 501 Not Implemented ※200 番台…成功応答 300 番台…リダイレクション 400 番台…クライアントによるエラー 500 番台…サーバによるエラー 2) アクション [133] [1] 直接メッセージを記述する
例)
ErrorDocument 404 “Your request is fault.
メッセージの最初に「"」を記述すること [2] 表示するファイルを記述する
例)
Error Document 401 /error.html
[3] 外部の URL へリダイレクトする
古い Apache のセキュリティホールに対してアタックしてきた人がいた場合に、Apache のサイトへリダ イレクトして情報を保存する
例) <Location /cgi-bin/phf*> Deny from all
ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi </Location>
Ⅴ-ⅲ. Web サーバへのアクセスコントロール
[136] ①Web サーバの接続制限を行う [137]1) httpd.conf において接続制限を行うディレクティブ
・Order :Allow と Deny の優先順と接続の基本ルールを決める ・Allow :接続を許可する
・Deny :接続を拒否する
2) 優先順位 (Order) [138]
・
Order allow,deny
Allow を先に読み込むが、規定値は拒否優先で Deny が明示的に表示されない場合、「Deny from all」を適 用する。
・
Order deny,allow
Deny を先に読み込むが、規定値は接続優先で Allow が明示的に表示されない場合、「Allow from all」を適 用する。
例) 拒否優先
<その 1>
Order deny,allow
Deny from all
Allow from (接続許可先)
<その 2>
Order allow,deny
- 15 - 3) 接続許可先の指定方法 指定方法の例 内 容 all すべて 192.168.0.5 クライアントの IP アドレス 192.168.0.0/24 192.168.0.0~192.168.0.255 のネットワーク 192.168.0.0/255.255.255.0 192.168.0.0~192.168.0.255 のネットワーク 192.168.0 192.168.0.0~192.168.0.255 のネットワーク domein.co.jp このドメインを含むホスト名※ ※ドメインで指定した場合は、「.」単位でドメインごとの指定が可能。たとえば「com」や「co.jp」でもよいし、 「subdomein.domein.co.jp」のようのなさ部ドメインでもよい。 ②パスワード認証(基本認証)を行う [141] httpd.conf の基本認証を行いたい<Directory>セクション内に次のディレクティブを記述する
1) 基本認証に使用するディレクティブ
ディレクティブ名
機 能
AuthName 認証する際のパスワード入力ダイアログボックスに表示する文字列 AuthType 認証の種類 AuthUserFile 認証を行うユーザ名 = パスワードのファイル AuthGroupFile 認証を行うグループのファイル Require リソースにアクセスできる認証ユーザ2) 「AuthName」ディレクティブ
例)
AuthName Authentication
AuthName “Please Enter Your Password.” AuthName “パスワードを入力してください”
3) 「AuthType」ディレクティブ
基本認証の場合
AuthType Basic4) 「AuthUserFile」ディレクティブ
ユーザ認証を行うユーザとパスワードが記載されたファイルを指定
[1] “/”ではじまると絶対パスになり、そうでなければ「ServerRoot」ディレクティブからの
相対パスになる。
例) <設定> ServerRoot “/usr/local/apache/”
DocumentRoot “/usr/local/apache/htdocs”
↓
AuthUserFile Passwd/.htpasswd[2] .htpasswd の記述例
例)
Taro:mJa12k6A2
hanako:KLoP5685) 「AuthGroupFile」ディレクティブ
ユーザ認証を行うユーザの所属するグループを記述する
[1] “/”ではじまると絶対パスになり、そうでなければ「ServerRoot」ディレクティブからの
相対パスになる。
- 16 -
例)
AuthGroupFile passwd/.htgroup
[2] .htgroup の記述例
例)groupA:taro
groupB:taro hanako6) 「Require」ディレクティブ
[1]
Require user ユーザ名
認証を求めるユーザが、AuthUserFile に指定されたファイルにあればアクセスでき
る。ユーザ名はスペースで区切って複数記述可能。
[2]
Require group グループ名
認証を求めるユーザが、AuthGroupFile に指定されたグループに所属し、かつ AuthUserFile に指定され たファイルにあればアクセスできる。グループ名はスペースで区切って服す記述可能。[3]
Require valid-user
AuthUserFile に指定されたファイルにあるユーザであればアクセス可能[4]
Require file-owner
AuthUserFile に指定されたファイルにあるユーザで、ファイルの所有者であればアクセス可能。 (Apache1.3.20 以降)[5]
Require file-group
AuthUserFile に指定されたファイルにあるユーザで、ファイルの所有グループに属していることが AuthGroupFile に記述されていればアクセス可能。[6] 記述例
AuthUserFile passwd/.htpasswd
AuthGroupFile passwd/.htgroup
↓
・.htpasswd の内容
・.htgroup の内容
taro:mJa4Vld32KSA
groupA:taro
hanako:KLoP235Hyff
groupB:taro hanako
hoge:HjuigT3S4Hk
↓
この場合の記述例
・
Require valid-user
「taro」, 「hanako」, 「hoge」 全てアクセス可能
・
Require user taro
「taro」 のみアクセス可能
・
Require groupA
「taro」, 「hanako」 がアクセス可能
「hoge」 はアクセス不可
③パスワードファイルの編集
[145]パスワードファイルの作成・編集
→ htpasswd ユーティリティを使用
書式:パスワードファイルを作成 # htpasswd –c パスワードファイル名 書式:パスワードファイルにユーザを作成- 17 - # htpasswd オプリョン パスワードファイル名 ユーザ名
↓
パスワードの入力を求められる
オプション
暗号化方式
-m
MD5
-s
SHA
-d
crypt() (規定)
-p
非暗号化 (非推奨)
書式:パスワードの変更 # htpasswd パスワードファイル名 ユーザ名Ⅴ-ⅳ.他の Web サーバセキュリティ設定
[161]①Apache のログファイルの設定
[161]・access_log
:Apache へのアクセスを記録する
・error_log
:エラーを記録する
・referer_log :リンク元を記録する
・agent_log
:ユーザの Web ブラウザ情報を記録する
1) ログ全般にかかわる設定
[163]HostnameLooksup ディレクティブ
→ 接続元に記載するクライアントをホスト名にするか IP アドレスにするかを指定
HostnameLooksup
Off
:IP アドレス
HostnameLooksup
On
:ホスト名
※「On」にした場合、ネームサーバへのホスト名解決要求をそのつど送信することになり、多少なりともネットワークや CPU の負担になる2)エラーログの設定
[163][1] ErrorLog ディレクティブ
ログファイルのパスを指定
“/”で始まると絶対パスになり、そうでなければ ServerRoot ディレクティブからの相対パスになる。[2] LogLevel ディレクティブ
名 前
意 味
emerg
緊急事態
alert
緊急に修正する状態のメッセージ
crit
致命的な状態のメッセージ
error
通常のエラーメッセージ
warn
警告メッセージ
notice
特別な処理が必要なメッセージ
info
情報メッセージ
debug
デバッグメッセージ
※上から優先順位が高い
3) アクセスログなどの設定
[164]- 18 -
access_log, refere_log, agent_log の設定方法はほぼ同じ
次の 2 つのディレクティブで 1 セット
例)
LogFormat “%h %l %u %t ¥”%r¥ %>s
CustomLog logs/access_log common
書式:LogFormat ディレクティブ LogFormat “書式” エイリアス名
[1] 書式 (フォーマット文字)
・%h
:接続元
・%l
:接続もとの identd
・%u
:ユーザ ID (認証された場合のみ)
・%t
:リクエストの処理を終えた時刻
・%r
:接続元からのリクエスト
・%>s
:サーバからのステータスコード
・%b
:オブジェクトのサイズ (応答ベダを除く)
・%{Referer}:参照されたサイト(リンク元など)
・%{User-agent}:クライアントのブラウザ情報
[2] エイリアス名
・common
:通常のアクセスログ
・referer
:Referer 情報のログ
・agent
:User-agent 情報のログ
・combined
:common + referer + agent
Ⅵ.FTP サーバのセキュリティ
[177]Ⅵ-ⅰ. FTP サーバの ACL 設定を行う
[178]①
/etc/ftpaccess
でユーザの制御を行う
[180]1) 設定項目
[1] ユーザ単位
・deny-uid
:拒否
・allow-uid
:許可
[2] グループ単位
・deny-gid
:拒否
・allow-gid
:許可
2) 書式
書式:ユーザ制御の書式 ・deny-uid ユーザ名 ・deny-gid ユーザ名 ・allow-uid ユーザ名 ・allow-gid ユーザ名deny は allow より先に処理される。
ユーザ名またはグループ名は UID, GID でも記述可
→ この場合、数値の前に[%]
複数入力はスペースで区切る
「-」で区切ると範囲の指定
例) %-99
:99 以下
- 19 -
%65535-
:65535 以上
%10-%100
:10~100
3) 記述例
[1] Linux の全ての特権ユーザや特殊ユーザを FTP で拒否する場合
deny-gid %-99 %65535- deny-uid %-99 %65535- [2] FTP 接続を許可するユーザの uid を 500 番台。そのうち 500~549 まではゲストユーザとしたい場合 deny-uid * allow-uid %500-%599 gestuser * realuser %550-②
/etc/ftpusers
でアクセスできないアカウントを指定する
[182]/etc/ftpusers
→ アクセスできないアカウントを設定する
③ファイルごとに接続制限する
[183]1) ファイルのダウロード制限
→
/etc/ftpaccess
noretrieve
:ダウンロード拒否
allow-retrieve :ダウンロード許可
書式:ファイルごとの制限 ・noretrieve ファイル名 [class=クラス] ・allow-retrieve ファイル名 [class=クラス]2) ファイル名指定の例
・
/etc/passwd
:/etc/passwd が指定される。ほかのディレクトリにある passwd は指定されない
・
passwd
:全てのディレクトリにある passwd が対象になる
・
/etc
:/etc 以下のファイルが全て対象になる
・
/home/*/passwd
:/home ディレクトリ以下の passwd が対象となる
3) 制限されたファイル
制限されたファイルをダウンロードしようとすると次が表示される
550 /etc/passwd is marked unretrievable
④接続元での接続制限を行う [184]
1)
/etc/ftphosts
の設定
書式:接続元で接続制限を行う
・allow ユーザ名 接続元アドレス
・deny ユーザ名 接続元アドレス
例) deny * *
allow taro 192.168.0.0/24 localhost
allow hanako localhost
→ 基本的にはどこからもアクセスしてはいけないが、ユーザ「taro」の場合は
192.168.0.0~192.168.0.255 のネットワークとローカルホストからの接続は許
可し、「hanako」の場合はローカルホストからの接続のみが許可される
- 20 -
2)
/etc/ftpaccess
の deny 設定
→ 接続制限を行う設定項目のひとつ
書式:deny による接続拒否設定
deny 接続元アドレス メッセージファイル名
接続を拒否するとともに、指定したメッセージファイルを表示することができる。
Ⅵ-ⅱ.匿名 FTP サービス
[186]①匿名 FTP サービスの注意事項
[186]1) 匿名アクセス者の移動できるディレクトリを制限する
2) アップロードはできないようにする
3) 利用できるコマンドを制限する
②匿名 FTP でディレクトリを制限する [187]/etc/ftpaccess
内の項目 書式:anonymous-root anonymous-rootdeny ディレクトリ[クラス]ディレクトリは匿名 FTP ユーザがアクセスできるディレクトリを記述
この項目の設定がない場合、
/etc/passwd
に記述されたユーザ「ftp」のホームディレクトリが有効
③ファイルのアップロードができないようにする
[187]/etc/ftpaccess 内の項目
・
upload
例)
upload /var/ftp no
→
/var/ftp
ディレクトリを制限する
※匿名 FTP のルートディレクトリのパーミッションを書き込み不許可にしておく
④コマンドを利用できないようにする
[188]P173 で行ったコマンドを制限する方法を使う
chmod
no anonymous
delete
no anonymous
overwrite no anonymous
rename
no anonymous
⑤匿名 FTP ユーザのパスワードをチェックする
[188]1) /etc/ftpaccess 内の項目
書式:passwd-check passwd-check チェック方法 動作2) チェック方法
・none
:パスワードをチェックしない
・trivial :「@」が含まれているかをチェックする
・rgc822 :RFC822 に適合したメールアドレスであることをチェックする
3) 動作
・warn
:警告はするがログインを許可する
- 21 -
・enforce :警告し、ログアウトさせる
4) 基本設定