LPIC-2 試験勉強メモ その 13

LPIC-2 試験勉強メモ その 13

システムセキュリティ

カーネルパラメーターの設定

/proc/sys ディレクトリ配下にカーネルメモリ内のチューニング可能なパラメーターがファイルとして配置されている。

  • sysctl -a: カーネルパラメータの値をすべて表示
  • sysctl カーネルパラメーターのリスト: 指定したカーネルパラメーターの値を表示
  • sysctl -w カーネルパラメーター=値: 指定したカーネルパラメーターを設定
  • sysctl -p: /etc/sysctl.conf の設定を有効にする (システム起動時にも自動実行)
ファイル名カーネルパラメーター名説明
ip_forwardnet.ipv4.ip_forwardIP フォワーディング (1: 有効, 0: 無効)
icmp_echo_ignore_broadcastsnet.ipv4.icmp_echo_ignore_broadcastsブロードキャスト ICMP echo リクエストに対する反応 (1: 無視して応答しない, 0: 応答する)
tcp_syncookiesnet.ipv4.tcp_syncookiesSYN cookies の有効化 (1: 有効, 0: 無効)

Smuf 攻撃はブロードキャスト宛の ICMP echo リクエストを送信する攻撃である。 icmp_echo_ignore_broadcasts を有効化することで Smuf 攻撃に対する応答を返さない。 Sumuf 攻撃にはその他にルーターでディレクテッドブロードキャストを通さないようにする。

SYN flood 攻撃は 3 ウェイハンドシェイクの SYN パケットのみを対象のサーバーに送り続け、接続待機情報をメモリ上に大量に保持させる SYN flood 攻撃である。 tcp_syncookies を有効にすると、SYN flood 状態になった時に ACK 応答用の TCP シーケンス番号を ACK SYN パケットから特殊な計算で算出してメモリ領域外に保持する。

iptables

  • netfilter: IP パケットのフィルタリングやアドレス変換を行う
  • iptables: netfilter の設定ユーティリティ

IPv6 の場合、iptables と同様の構文で ip6tables コマンドを利用できる。 処理が行われるタイミングをチェインと呼ぶ。 iptables では -A オプションで指定する。

チェイン説明
INPUTローカルホストへの入力パケットに適用するチェイン
OUTPUTローカルホストからの出力パケットに適用するチェイン
FORWARDローカルホストを経由するフォワードパケットに適用するチェイン
PREROUTINGルーティング決定前に適用するチェイン
POSTROUTINGルーティング決定後に適用するチェイン

パケットの処理方法によって 4 種類のテーブルがある。 iptables では -t オプションで指定する。

テーブル説明含まれるチェイン
filterフィルタリングを行うINPUT, FORWARD, OUTPUT
natアドレス変換を行うPREROUTING, OUTPUT, POSTROUTING
mangleパケットヘッダの書き換えを行うPREROUTING, OUTPUT, INPUT, FORWARD, POSTROUTING
rawコネクション追跡を行わないPREROUTING, OUTPUT

想定される主な通信によって次の順で処理される。

通信処理順
外部から自ホスト宛nat/PREEROUTING, filter/INPUT
外部から他ホスト宛転送nat/PREROUTING, filter/FORWARD, nat/POSTROUTING
自ホストから外部宛nat/OUTPUT, filter/OUTPUT, nat/POSTROUTING

処理ルールの一致条件には次のようなものがある。

指定項目書式説明
プロトコル[!] -p(--protocol) <プロトコル>プロトコルを指定 (tcp, udp, icmp, all)
送信元アドレス[!] -s(--source) <アドレス[/マスク]>送信元アドレスの指定 (指定なしの場合はすべて対象)
送信先アドレス[!] -d(--destination) <アドレス[/マスク]>送信先アドレスの指定 (指定なしの場合はすべて対象)
送信元ポート[!] --sport ポート番号送信元ポートの指定 (指定なしの場合はすべて対象)
送信先ポート[!] --dport ポート番号送信先ポートの指定 (指定なしの場合はすべて対象)
送信元ポート (複数)-m multiport [!] --sports(--source-ports) ポート番号のリスト送信元ポートのリストをカンマ区切りで指定
送信先ポート (複数)-m multiport [!] --dports(--destination-ports) ポート番号のリスト送信先ポートのリストをカンマ区切りで指定
TCP フラグ[!] --tcp-flags(--syn) <第 1 引数> <第 2 引数>第 1 引数で評価するフラグをカンマ区切りで指定、第 2 引数で設定されているべきフラグを指定
受信インタフェース[!] -i(--in-interface) <インタフェース>INPUT, FORWARD, PREROUTING のいずれかで指定可能
送信インタフェース[!] -o(--out-interface) <インタフェース>FORWARD, OUTPUT, POSTROUTING のいずれかで指定可能
ステート[!] --state <ステート>コネクション追跡機構により対象のステートを判定 (NEW, ESTABLISH, RELATED など)

ルールに合致したパケットに適用する処理をターゲットと呼ぶ。 -j, --jump オプションで指定する。 どのルールにも一致しなかったパケットはチェインによって ACCEPT もしくは DROP で処理される。 デフォルトのポリシーは -P オプションで指定可能。

iptables -t <テーブル名> -P [ACCEPT|DROP]
ターゲット使用できるテーブル使用できるチェイン説明
ACCEPTすべてすべて許可
REJECTすべてINPUT, OUTPUT, FORWARD拒否 (ICMP エラーメッセージを返す)
DROPすべてすべて破棄 (ICMP エラーメッセージを返さない)
DNATnatPREROUTING, OUTPUT送信先のアドレスの書き換え
SNATnatPOSTROUTING送信元アドレスの書き換え
MASRADEnatPOSTROUTING送信元アドレスの動的書き換え
LOGすべてすべてログを記録し、次のルールへ進む
ユーザー定義チェインすべてすべてユーザーが独自に定義する
ルールの表示
iptables -t <テーブル名> -L [-v]
  • -t: テーブルを指定
  • -L, –list: ルールの表示
  • -v: 設定情報をすべて表示
ルールの追加
iptables [-t <テーブル>] -A <チェイン> <ルール>
iptables [-t <テーブル>] -I <ルール番号> -A <チェイン> <ルール>
  • -I: 指定した番号にルールを追加する (指定しない場合は先頭)
ログ

パケットのログはファシリティ = kernel として記録される。

IPv6

  • GUA (グローバルユニキャストアドレス): インターネット上で使用するアドレス
    • プレフィックス: 3 ビット (001), 2000::/3
    • サブネット ID: 61 ビット
    • インタフェース ID: 64 ビット
  • LLA (リンクローカルアドレス): 同一リンク上でのみ有効なアドレス
    • プレフィックス: 10 ビット (1111111010)
    • パディング: 54 ビット (すべて 0), fe80::/64
    • インタフェース ID: 64 ビット
  • ULA (ユニークローカルユニキャストアドレス): サイト内で使用するローカルなアドレス
    • プレフィックス: 7 ビット (1111110), fc00/7
    • L: 1 ビット (1: ローカル定義、0: 未定義)
    • グローバル ID: 40 ビット (乱数で生成)
    • サブネット ID: 16 ビット
    • インタフェース ID: 64 ビット
  • route コマンドの場合は -A inet6
  • ip コマンドの場合は ip -6

LLA はルーティングの宛先としてエントリーを作成することはできないが、ネクストホップには指定できる。 ルーティングの宛先には GUA 及び ULA を指定できる。

FTP サーバーのセキュリティ

anonymous ftp

アカウントを持たないユーザーでも匿名ログインできるサーバーである。 ログイン名に anonymous あるいは ftp を利用する。 主に公開ファイルのダウンロード用途で利用される。

アップロードにはディレクトリに対して書き込み権と実行権が必要となる。 他のファイルを閲覧できないように読み込み権外す。

  • ProFTPD
  • Pure-FTPd
  • vsftpd

vsftpd

主要な Linux ディストリビューションで標準の FTP サーバーとして提供される。

セキュリティ担保のため、chroot でルートディレクトリを変更することを chroot jail と呼ぶ。

  • anonymous_enable=YES: Anonymous FTP として動作する
  • anon_root=/<ディレクトリ>: chroot のルートディレクトリを指定

共有ライブラリを使用するには ld.so.conf ファイルを編集し、 ldconfig コマンドを実行する。 使用するコマンドがある場合は chroot 後のディレクトリ配下の /lib に共有ライブラリを配置する。

SSH の設定

SSH (Secure Shell) は 22 番ポートを利用した暗号化通信でログインするシェルである。 暗号化方式に公開鍵暗号、認証方式には公開鍵認証やパスワード認証を使用できる。

設定ファイル sshd_config にディレクティブを記述する。

ディレクティブ説明
Port待機ポート番号
Protocolプロトコルバージョン
PermitRootLoginroot ログイン
PubkeyAuthentication公開鍵認証
AuthorizedKeysFileユーザー認証の公開鍵格納ファイル名
PasswordAuthenticationパスワード認証
AllowUsersログインを許可するユーザー
X11ForwardingX11 ポートのポートフォワーディング

authorized_keys ファイルにはユーザー認証で用いる公開鍵の情報を設定する。

ssh-keygen コマンド

秘密鍵と公開鍵のキーペアを生成する。

ssh-keygen -t キータイプ
  • rsa1: プロトコルバージョン 1 の rsa キー
  • rsa: プロトコルバージョン 2 の rsa キー
  • dsa1: プロトコルバージョン 2 の dsa キー

rsa キーは RSA (Rivest Shamir Adleman) 方式で使用されるキーである。 大きな素数の素因数分解の困難さを利用したもので広く普及している。

dsa キーは (Digital Signature Algorithm) 方式で使用されるキーである。 離散対数問題の困難さを利用している。

認証方式

すべての認証方式が許可される場合、次の優先順位となる。

  1. ホストベース認証
  2. 公開鍵認証
  3. パスワード認証

ホストベース認証を有効にする場合は設定ファイルに HostbasedAuthentication yes と記述し、次のように設定する。

  • ssh-agent デーモンに一度パスフレーズを入力して復号化した秘密鍵を保持させる
  • キーペア作成時にパスフレーズを指定せず、暗号化しない秘密鍵を使用する
  • ホストベース認証で暗号化されていないホスト秘密鍵を使用する (許可するクライアントを ~/.shosts/ もしくは ~/.rhosts に記述)

ポート転送

ssh によるポート転送により、通信経路を暗号化できる。 複数のポートを一度に転送することも可能。

  • ローカルから (ssh クライアント) からリモート (ssh サーバー) へのポート転送
ssh -L <転送元ポート番号>:<転送先ホスト>:<転送先ポート番号> <ssh サーバー>
  • リモート (ssh サーバー) から ローカルから (ssh クライアント) へのポート転送
ssh -R <転送元ポート番号>:<転送先ホスト>:<転送先ポート番号> <ssh サーバー>
  • -L: ローカルからリモートへポート転送する
  • -R: リモートからローカルへポート転送する
  • -N: コマンドを実行セs図、ポート転送のみ行う
  • -f: ssh をバックグラウンドプロセスとして実行する
  • -g: ポート転送時、ローカルホスト以外からも転送元ポートを利用できるようにする

OpenVPN

OpenVPN はオープンソースの VPN ソフトウェアである。 SSL/TLS を利用してネットワーク層あるいはデータリンク層の通信をサーバーとクライアント間で暗号化してトンネリングする。 相互の認証には公開鍵認証方式を使用する。

単一のポート (1194/UDP) で複数のクライアントとのトンネリングをサポートする。 クライアント側でポート番号を動的に割り当てるにはクライアント設定ファイルに nobind と指定する。 ネットワーク層のトンネリングにはデバイス tun (/dev/net/tun)、データリンク層のトンネリングにはデバイス tap (/dev/net/tap) を使用する。 サーバーがクライアント間の通信を中継するにはサーバー設定ファイルに client-toclient を指定する。

  • p2p モード: サーバーとクライアントが 1 対 1 で接続する (デフォルト)
  • server モード: サーバーとクライアントが 1 対多で接続する

用意するファイル

ファイルファイル内容サーバークライアント
ca.crtCA 証明書
ca.keyCA 秘密鍵
dn{n}.pemDH パラメーター
server.crtサーバー証明書
server.keyサーバー秘密鍵
client1.crtクライアント証明書
client.keyクライアント証明書
server.confサーバー設定ファイル
client.confクライアント設定ファイル

server.conf

  • CA 証明書ファイル名
  • CA によるサーバー証明書ファイル名
  • サーバー秘密鍵ファイル名
  • サーバーポート番号
  • 仮想ネットワークのアドレス

client.conf

  • サーバー名とポート番号
  • CA 証明書ファイル名
  • CA によるクライアント証明書ファイル名
  • クライアントの秘密鍵ファイル名

セキュリティソフトウェア

ネットワーク攻撃されている時は tcpdump コマンドや GUI の wireshark を使ってパケットをモニタリングする。

fail2ban はブルートフォースアタックを防御するプログラムである。 サーバープログラム fail2ban-server と クライアントプログラム fail2ban-client から構成される。 fail2ban-server は OpenSH や Apache などのサーバーログから認証失敗の記録を検知して、当該クライアント IP からのアクセスを iptables で禁止する。 アクセスの禁止操作を jail と呼び、jail の閾値は /etc/fail2ban/jail.conf の中で定義する。

オプション説明
enabled = trueセクション [ssh-iptables] の定義を有効にする
filter = sshdフィルターは filterd./sshd.conf で定義
action = iptables[] sendmail-whois[]iptables アクションは action.d/iptables.conf、sendmail-whois アクションは action.d/sendmail-whois.conf で定義
logpath = /var/log/secure監視するログファイルは /etc/log/secure
maxretry = 5連続で 5 回失敗すると定義したアクションによってアクセスを禁止する
bantime = 600指定した秒数を経過すると禁止を解除する (負数に指定した場合は手動で解除する)

nc コマンド

  • クライアント/サーバー機能
    • サーバー側: nc -l ポート番号
    • クライアント側: nc サーバー名 ポート番号
  • データ転送機能
    • サーバー側: nc -l ポート番号 > ファイル名
    • クライアント側: nc サーバー名 ポート番号 < ファイル名
  • スクリプトによるリモートサービステスト機能
    • クライアント側: nc サーバー名 ポート番号 < スクリプト名
  • ポートスキャン機能
    • クライアント側: nc -z ホストアドレス ポート範囲

nmap コマンド

リモートホストに対して一連の TCP パケットや ICMP パケットを送信してホストの OS 種類やバージョンを判別する。 subject fingerprint を reference fingerpprint と比較して判別を行う TCP/IP stack fingerprinting と呼ばれる手法である。

nmap [オプション] ホストアドレス
  • -O: OS の判別
オプションProtocolroot説明
-sSTCPTCP Syn scan: SYN パケットのみを送信して応答を調べる
-sTTCP不要TCP connect scan: ソケット API を使用し、コネクションを確立して調べる
-sUUDPUDP scan: UDP ポートをスキャンする
-sNTCPTCP NULL scan: どの TCP フラグも立てないパケットを送信して応答を調べる
-sFTCPTCP FIN scan: FIN フラグだけを立てたパケットを送信して応答を調べる
-sXTCPTCP Xmas scan: FIN、PSH、URG のフラグを立てたパケットを送信して応答を調べる

ネットワーク脆弱性テスト

OpenVAS はオープンソースのネットワークセキュリティスキャナである。 脆弱性 (Vulnerabirity) と重大さ (Severity) の度合いの高い順に検査結果が表示される。

  • OpenVAS Manager: Scanner を制御し、Scanner からのスキャン結果を受け取ってデータベースに格納する
  • OpenVAS Scanner: NASL (Nessus Attack Scripting Language) で書かれた多数の NVT (Netwoek Vulnerability Test) を実行する
  • OpenVAS CLI: コマンドラインベースの操作用ツール
  • Greenbone Security Assistant: Web ベースの GUI ツール

セキュリティ情報の入手

  • CERT (Cpmputer Emergency Response Team/Coordination Center): 世界中のインターネットセキュリティ問題を扱う米国の研究センター
  • CSIRT (Computer Security Incident Response Team): インターネットセキュリティ問題の情報収集や調査を行う組織の一般名称
  • COAC (Computer Incident Advisory Capability): 米国エネルギー省内の CSIRT で、現在は JC3 という名称
  • Bugtraq: コンピューターセキュリティに関するメーリングリスト