システムセキュリティ
カーネルパラメーターの設定
/proc/sys
ディレクトリ配下にカーネルメモリ内のチューニング可能なパラメーターがファイルとして配置されている。
- sysctl -a: カーネルパラメータの値をすべて表示
- sysctl カーネルパラメーターのリスト: 指定したカーネルパラメーターの値を表示
- sysctl -w カーネルパラメーター=値: 指定したカーネルパラメーターを設定
- sysctl -p:
/etc/sysctl.conf
の設定を有効にする (システム起動時にも自動実行)
ファイル名 | カーネルパラメーター名 | 説明 |
---|---|---|
ip_forward | net.ipv4.ip_forward | IP フォワーディング (1: 有効, 0: 無効) |
icmp_echo_ignore_broadcasts | net.ipv4.icmp_echo_ignore_broadcasts | ブロードキャスト ICMP echo リクエストに対する反応 (1: 無視して応答しない, 0: 応答する) |
tcp_syncookies | net.ipv4.tcp_syncookies | SYN 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 エラーメッセージを返さない) |
DNAT | nat | PREROUTING, OUTPUT | 送信先のアドレスの書き換え |
SNAT | nat | POSTROUTING | 送信元アドレスの書き換え |
MASRADE | nat | POSTROUTING | 送信元アドレスの動的書き換え |
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 | プロトコルバージョン |
PermitRootLogin | root ログイン |
PubkeyAuthentication | 公開鍵認証 |
AuthorizedKeysFile | ユーザー認証の公開鍵格納ファイル名 |
PasswordAuthentication | パスワード認証 |
AllowUsers | ログインを許可するユーザー |
X11Forwarding | X11 ポートのポートフォワーディング |
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) 方式で使用されるキーである。 離散対数問題の困難さを利用している。
認証方式
すべての認証方式が許可される場合、次の優先順位となる。
- ホストベース認証
- 公開鍵認証
- パスワード認証
ホストベース認証を有効にする場合は設定ファイルに HostbasedAuthentication yes
と記述し、次のように設定する。
- ssh-agent デーモンに一度パスフレーズを入力して復号化した秘密鍵を保持させる
- キーペア作成時にパスフレーズを指定せず、暗号化しない秘密鍵を使用する
- ホストベース認証で暗号化されていないホスト秘密鍵を使用する (許可するクライアントを
~/.shosts/
もしくは~/.rhosts
に記述)
ポート転送
ssh によるポート転送により、通信経路を暗号化できる。 複数のポートを一度に転送することも可能。
- ローカルから (ssh クライアント) からリモート (ssh サーバー) へのポート転送
1 | ssh -L <転送元ポート番号>:<転送先ホスト>:<転送先ポート番号> <ssh サーバー> |
- リモート (ssh サーバー) から ローカルから (ssh クライアント) へのポート転送
1 | 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.crt | CA 証明書 | ◯ | ◯ |
ca.key | CA 秘密鍵 | ◯ | – |
dn{n}.pem | DH パラメーター | ◯ | – |
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 と呼ばれる手法である。
1 | nmap [オプション] ホストアドレス |
- -O: OS の判別
オプション | Protocol | root | 説明 |
---|---|---|---|
-sS | TCP | 要 | TCP Syn scan: SYN パケットのみを送信して応答を調べる |
-sT | TCP | 不要 | TCP connect scan: ソケット API を使用し、コネクションを確立して調べる |
-sU | UDP | 要 | UDP scan: UDP ポートをスキャンする |
-sN | TCP | 要 | TCP NULL scan: どの TCP フラグも立てないパケットを送信して応答を調べる |
-sF | TCP | 要 | TCP FIN scan: FIN フラグだけを立てたパケットを送信して応答を調べる |
-sX | TCP | 要 | TCP Xmas scan: FIN、PSH、URG のフラグを立てたパケットを送信して応答を調べる |
ネットワーク脆弱性テスト
OpenVAS はオープンソースのネットワークセキュリティスキャナである。 脆弱性 (Vulnerabirity) と重大さ (Severity) の度合いの高い順に検査結果が表示される。
- OpenVAS Manager: Scanner を制御し、Scanner からのスキャン結果を受け取ってデータベースに格納する
- OpenVAS Scanner: NASL (Nessus Attack Scripting Language) で書かれた多数の NVT (Network 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: コンピューターセキュリティに関するメーリングリスト
コメント