9. ネットワークセキュリティ
9.1. ネットワークセキュリティの強化
9.1.1. Radius
Radius(Remote Authentication Dial-In User Service)は接続するユーザーとネットワーク サービスに一元的な認証、認可、アカウンティング(通称AAA)を提供するプロトコルのこと。
- 認証(Authentication) ... クライアント (ユーザー、デバイス、またはプロセス) がシステムの本物のユーザーであるかどうかを判断するプロセス
- 認可(Authorization) ... クライアントがネットワーク上で何を行うことが許可されているかを決定するプロセス
- アカウンティング ... ネットワーク上のクライアントのアクティビティを監視し、サービスのコストを計算するために必要な情報を提供するプロセス
3つの AAA プロトコルすべてを使用する必要はなく、必要なプロトコルのみを使用する。
9.1.2. FreeRADIUS
FreeRADIUSはOSSのRadius実装で最も広く使用されている RADIUS サーバのこと。 FreeRADIUSは認証サービスを提供するradiusdデーモンを提供する。
インストール
サービスの開始
/etc/raddb/*
/etc/raddb/*
以下にFreeRADIUSの設定ファイルが格納される。
代表的な設定ファイルは以下の通り。
radiusd.conf
... FreeRADIUSのプライマリ設定ファイル。サーバーのログ記録とパフォーマンスの設定ができるclient.conf
... クライアント構成ディレクティブproxy.conf
... プロキシ半径およびrealm設定ディレクティブpolicy.d
Radmin
radminは実行中のサーバーの制御ソケットに接続し、それにCLIを提供するFreeRADIUSサーバー管理ツールのこと。
オプション | 説明 |
---|---|
-d | デフォルトは/etc/raddb 。 radmin はここでサーバー構成ファイルを検索し、制御ソケットのファイル名を定義する「listen」セクションを見つけます。 |
-D 辞書ディレクトリ | メイン辞書ディレクトリを設定する。 デフォルトは/usr/share/freeradius となる |
-e コマンド | コマンドを実行して終了する |
-E | 実行中のコマンドをEchoする |
-f ソケットファイル | ソケットファイル名を直接指定する |
-h | ヘルプ情報の表示 |
-i 入力ファイル | 指定されたファイルから入力を読み取る。指定しない場合はstdin が使用される |
-n 名前 | /raddb/radiusd.conf の代わりに/raddb/name.conf を読み取る |
基本構成
デフォルトの構成を使用することがサーバの設定を最も破壊せずに使用できる方法といえる。 この場合、ユーザとパスワードの設定のみでよくなる。 手順は以下の通り。
/etc/raddb/clients.conf
を編集してエントリ追加するipaddr
にクライアントIP、secret
には通信の暗号化と復号化に使用される共有秘密を指定/etc/raddb/users
を編集しユーザアカウントを作成するtesting Cleartext-Password := "password"
のように設定- サーバーをデバッグモードで起動する(
radiusd -X
)
なお、クライアントの設定方式は以下のようになる。
radtestコマンド
FreeRADIUS サーバーが動作可能になった際に、アカウントをテストできるコマンド。
使用例は以下の通り。
radclientコマンド
radclientは任意のRADIUSパケットをRADIUSサーバに送信し応答を表示するコマンド。れは、RADIUS サーバーの設定に加えた変更をテストするために使用したり、RADIUS サーバーが稼働しているかどうかを監視したりするために使用できる。
radlastコマンド
radlastコマンドはlast
コマンドのFreeRADIUS サーバーにおけるフロントエンド。
radwhoコマンド
radwhoコマンドは現在ログオンしているユーザーを表示するコマンド。
9.1.3. ネットワークユーティリティ
tcpdumpコマンド
tcpdumpはシステムを通過する TCP/IP パケットなどのネットワーク トラフィックをキャプチャ、フィルタリング、分析するために使用できるコマンド。 システム管理者が Linux での接続の問題をトラブルシューティングするためのコマンドともいえる。
なおtcpdumpを用いて.pcap
ファイルにパケット情報を保存することもできる。
オプション | 説明 |
---|---|
-i <インターフェイス> | 指定したインターフェイスの監視 |
-n | ホスト名ではなくIPアドレスの表示 |
-r <ファイル> | ファイルからパケット情報を取得 |
-w <ファイル> | パケット情報をファイルへ出力する |
-s <バイト数> | パケットを取り出すバイト数を指定する |
-x | パケット内容を16進数で表示する |
-X | パケット内容を16進数とASCII文字列で表示する |
-p | プロミスキャスモードにしない |
-m | MIBモジュールを読み込む |
条件式修飾子 | 説明 |
---|---|
host <ホスト> | 送信先/送信元がホストならば真 |
port <ポート番号> | 送信元/送信先がポート番号ならば真 |
src <送信元> dst <送信元> |
送信元/送信先の条件指定 |
and , or | 複合条件の設定 |
WireShark
Wireshark はパケットを分析するためのGUIツール。 Wireshark は GUI ツールだが、tshark として知られる CLI に相当するツールがある。
Wiresharkでは、条件を指定することで表示するパケットをフィルタリングすることができる。
フィルタ条件 | 説明 |
---|---|
host <ホスト> | 送信先/送信元がホストのパケットをキャプチャ |
net <ネットワーク> | 対象のネットワークを流れるパケットをキャプチャ |
[tcp/udp] port <ポート> | 対象プロトコルのポートが流れるパケットをキャプチャ |
src/dst <送信元> | 送信先/送信元が送信元/送信先のパケットのみをキャプチャ |
portrange A-B | ポート番号A-Bの範囲のパケットをキャプチャ |
条件式は以下の通り。
A eq B
... A=BA gt B
... A>BA ge B
... A>=BA lt B
... A<BA le B
... A<=BA and B
... AかつBA or B
... AまたはBnot <条件式>
... 条件満たさないときA[パターン] == B
... パターンがBに合致でおk
Tshark
TSharkはWireSharkのCUIユーティリティ。 使用できるコマンドは以下の通り。
オプション | 説明 |
---|---|
-D | 有効なネットワークインターフェイス一覧表示 |
-i <インターフェイス> | ネットワークインターフェイスを指定 |
-f <フィルタ条件> | キャプチャするパケットフィルタ |
-w <ファイル> | キャプチャしたパケットをファイルへ保存 |
-r <ファイル> | ファイルからパケット情報を読みこむ |
-z <項目> | 項目に対する統計情報を出力 |
-V | 詳細表示 |
ndpmon
ndpmonはNDP(Neighbor Discovery Protocol)を監視するツール。NDPに関する状況をlogに記載したり、アラートメールを送信することも可能。
NDPはIPv6においてデータリンク層のアドレス解決を行うプロトコル。 NDPで利用されるメッセージの一つに、IPv6ルータからの応答であるルータ広告(RA:Router Advertisement)がある。RAはICMPv6を用いたグローバルIPアドレスのプレフィックスなどの情報で、悪意ある攻撃者がルータに成りすますとRAが書き換えられ不正なRAが発信される可能性がある。
ndpmonは、NDPをモニタリングすることにより、不正なRAを検出することができる。
Kismet
Kismetはワイヤレス ネットワークとデバイスの検出器、スニファー、ワードライビング ツール、および WIDS (ワイヤレス侵入検出) フレームワークのこと。
kismet_client
とkismet_drone
、kismet_server
コマンド/ユーティリティで構成される。
aircrack_ng
aircrack_ng
はWiFi ネットワークのセキュリティを評価するためのツール。
可能なことは以下の通り。
- モニタリング ... パケットのキャプチャとデータのテキスト ファイルへのエクスポートにより、サードパーティ ツールによるさらなる処理が可能
- 攻撃 ... パケットインジェクションによるリプレイ攻撃、認証解除、偽のアクセスポイントなど
- テスト ... WiFi カードとドライバーの機能を確認する (キャプチャとインジェクション)
- クラッキング ... WEP および WPA PSK (WPA 1 および 2)
Bettercap
BettercapはIEEE.802.11、BLE、IPv4、IPv6 ネットワークの偵察と MITM 攻撃用のツール。
9.1.4. ネットワークスレッド
不正ルーターによるアドバタイズメント
不正ルータによるルータ通知(アドバタイズメント)を防ぐにはカーネルを調整することで軽減できる。設定すべきファイルは以下の通り。
/proc/sys/net/ipv6/conf/<interface>/forwarding
/proc/sys/net/ipv6/conf/<interface>/accept_ra
Rouge DHCP メッセージ
DHCP スヌーピングを使用して対処できる。
9.2. ネットワーク侵入の検知
9.2.1. ネットワーク帯域監視
帯域監視は、トラフィック監視などとも呼ばれ、ネットワーク上を流れるデータ通信量を監視することを指す。
Linuxで帯域監視を行えるソフトウェアにntopやCacti)がある。
Ntop(ntopng)
ntopはネットワークトラフィック(L2,L3)監視ソフトウェアで、ネットワークのステータス、UDP、TCP、DNS、HTTP、その他のプロトコルのトラフィックのプロトコルごとの分布をWebブラウザ上で確認できる。
設定ファイルは/etc/ntopng.conf
となる。
ntop コマンド | 説明 |
---|---|
/usr/sbin/ntop -A | ntop 管理者ユーザーのパスワードを設定する |
ntop --set-admin-password=NewP@$$ | 新しい管理者パスワードを設定する |
ntop -P /etc/ntop -w4242 -d | /etc/ntop 設定ファイルをポート番号 4242 で使用して、ntop をデーモンとして実行する。 -Wオプションは、Web ブラウザを通じて ntop にアクセスするポートを有効にする。このオプションを指定しない場合、デフォルトのポートは3000。 -dオプションを指定すると、ntop がデーモン モードで有効になる。 |
Cacti
Cactiは、RRDtoolと呼ばれるデータロギングとグラフィカルな描画を行う業界標準のツールを使った、WebUIを持つネットワーク監視ソフトのこと。
サーバ等の機器の動作状況をSNMP(Simple Network Management Protocol)を用いて監視できる。
RRDtool: RRDへデータを保持し、グラフを作成するOSS
9.2.2. Snort
Snortはネットワーク型IDSとして代表的なソフトウェア。 検知するパケットのルール(シグネチャ)を定義したルールファイルを参照して不正なパケットを検知する。
Snortには以下の用途で使用できる。
- tcpdumpのようにパケットスニファとしての使用
- パケット ロガーとしての使用
- 本格的なIDSとしての運用
Snortのインストール
ソースからのダウンロードや、RedHatユーザはコチラからダウンロードできる。
Snortの構成
Snortの設定は/etc/snort/snort.conf
ファイルで行う。
Debianの場合はSnort のデフォルト構成ファイル内の一部のネットワーク設定を上書きする必要がある。手順は/etc/snort/snort.debian.conf
を確認して行う。詳しくは公式ドキュメントより。
/etc/snort/*
ファイル | 説明 |
---|---|
/etc/snort/snort.conf | ネットワーク構成/監視するポートの定義が可能 |
Snortルール
Snortルールはシグネチャとは異なる検出手法でルールを作成するには、脆弱性が実際にどのように機能するかを正確に理解してルールを作成する必要がある。そのためデフォルトのルールセットを通常は用いると良い。
なおSnortルールは、/etc/snort/snort.conf
ファイル内の行をコメント化またはコメント解除することによって有効または無効になる。
ルールは/etc/snort/rules
に保存される。
Snortルールの構文
Snortルールは、ルールヘッダとルールオプションという 2 つの主要なコンポーネントで構成される。
なおルールセット(ルールファイル)に記述したシグネチャ(ルール)を変更した後は、snortプロセスを再起動することで変更が反映される。
構成は以下の通り。
- ルールアクション
alert
... ルールマッチしたパケットのログを記録し警告を出力するlog
... ルールにマッチしたパケットをログに記録pass
... ルールにマッチしたパケットを無視activate
... ルールにマッチしたパケットについて警告出力し、対応するdynamicアクションの実行を行うdynamic
... activateアクションから呼び出され、該当パケットをログに記録
- プロトコル
- 検知対象(tcp, udp, icmp, ip)を記録
- IPアドレス
- x.x.x.xか範囲([x.x.x.x,y.y.y.y])または任意(any)で指定
- ポート番号
- ポート番号(x)または範囲((x,y))または任意(any)で指定
- 方向演算子
->
:右側が送信先、左側が送信元となる<>
:左右に記載されるIP/ポートが送信先/送信元どちらでもよい
- ルールオプション
- 検知するパケットルールの指定
- 未指定の場合はルールヘッダに垣外数るすべてのパケットがマッチする
snortのルールセット
Snortの主なルールセットは以下の通り。
ルールファイル | 説明 |
---|---|
dos.rules | DoS攻撃を検出するためのルール |
ftp.rules | FTPサービスへの攻撃を通知するためのルール |
local.rules | ユーザ独自のルール |
scan.rules | スキャンを検知するためのルール |
smtp.rules | smtpサービスへの攻撃を検知するためのルール |
telnet.rules | telnetサービスへの攻撃を検知するためのルール |
web-cgi.rules | WEBサーバのCGIに対する攻撃を検知するためのルール |
snortコマンド
オプション | 説明 |
---|---|
-b | ログをtcpdump形式で記録 |
-c 設定ファイル | 設定ファイルの指定 |
-d | アプリケーション層のデータも記録 |
-D | バックグラウンドで実行 |
-g <グループ> | 記録するグループの指定 |
-u <ユーザ> | 起動するユーザの指定 |
-i <インターフェイス> | ネットワークインターフェイスの指定 |
-l <ディレクトリ> | ログディレクトリの指定 |
9.2.3. OpenVASとNASL
OpenVAS(Open Vulnerability Assessment System)は、OSSの脆弱性スキャナソフトウェア。Network Vulnerability Tests(NVTs)と呼ばれる脆弱性テストを常に更新でき、最新の脆弱性情報にすばやく対応できることが強みで、CLIでもGUIでも操作できるインタフェースを持つ。
NASLはNessusやOpenVASなどの脆弱性スキャナーで使用されるセキュリティ対策用に特化したスクリプト言語のこと。NASLを使用すると、既知の脆弱性に基づいて特定の攻撃を自動化できる。
なおOpenVasの設定は/etc/openvas/
以下に配置され、/etc/openvas/openvassd.conf
が全体における主要な動作の設定ファイルとなる。
openVASのユーティリティ
OpenVASを操作するユーティリティには以下のようなものがある。
ユーティリティ | 機能 |
---|---|
openvasmd | OpenVasManager: 各種操作が行える |
openvasmd --rebuild | データベースの再構築を行う |
openvassd | スキャン処理を行う |
openvas-nvt-sync | NVTsを更新する |
openvas-mkcert | クライアントと暗号化通信を行うための証明書を発行する |
ユーザの追加と削除
OpenVASではユーザごとにスキャン内容を設定することができる。 ユーザ追加/削除は以下コマンドで可能。
NTSsのアップデート
openvas-nvt-sync
コマンドで最新の状態にアップデートすることができる。
クライアントとの通信の暗号化
OpenVASスキャナとこれを使うクライアント間の通信はSSL化される。
この際に必要な証明書はopenvas-mkcert
コマンドで作成できる。
9.3. パケットフィルタリング
9.3.1. ファイヤーウォールの基礎
ファイヤーウォールのアーキテクチャ
ファイヤーウォールのアーキテクチャにはパケットフィルタリング型とゲートウェイ型がある。
- パケットフィルタリング型
- 通信を細分化したパケットを監視するファイアウォール
- 通信をパケット単位で解析し、決められたルールに基づいて通過の許否を判断する
- アプリケーション層レベルの判断はできない
- ゲートウェイ型
- 内部コンピュータの代わりに通信を行うファイアウォール
- アプリケーション型、プロキシサーバ型とも呼ばれる
- データの細切れであるパケットの中身まで把握できる
- アプリケーション層(FTP, HTTPなど)でのフィルタリングを行うことができる
パケットフィルタリング型ファイヤーウォール
パケットフィルタリング型には以下の2種類がある。
- ステートレス ... 個々のパケットについて、スタティックなIPアドレスおよびポート番号のみのフィルタリングを行う
- ステートフル ... 往きのパケットに基づき、戻りのパケットに対してもフィルタリングルールを適用する
9.3.2. ファイヤーウォール
Netfilter
Netfilterはカーネルモジュールであり、カーネルがインターフェイスに転送するネットワークトラフィックはすべて netfilter を通過するようになっている。 netfilterモジュールへの主要なインターフェイスはiptablesであり、Linux ファイアウォールで高度な構成を行うことができる。
iptablesは複雑であるため、ufw 、 firewalld などの他の解決策が考案された。 これらは iptables と連携して動作し、ファイアウォールの設定を簡単に行えるようにする。
Iptables
iptablesはテーブルとして動作し以下の3種類の機能を提供する。
- Filter ... パケットフィルタリングとして使用される
- NAT ... アドレス変換に使用される
- MANGLE ... パケットを特別な処理をしたい場合に使用される
各テーブルにはチェインがあり、どの種類のパケットをフィルタリングするか定義するために使用される。 以下の種類がある。
- PREROUTING - (NAT, MANGLE)
- パケットがルーティングテーブルに渡される前に処理する
- 通常はパケットを別のアドレスまたはポートにリダイレクトするために使用する(DNAT)
- INPUT - (NAT, Filter, MANGLE)
- パケットがホストに到着するときに処理する
- ネットワークからの着信接続や、ローカルプロセスからのローカルホストへの通信が含まれる
- OUTPUT - (NAT, Filter, MANGLE)
- ホストから発信されるパケットを処理する
- ローカルホストから外部のネットワークへの接続や、ローカルプロセスからの通信が含まれる
- FORWARD - (Filter, MANGLE)
- ホストを経由して他のホストに送信されるパケットを処理する
- ルーターがパケットを他のネットワークセグメントにルーティングする際に使用する
- POSTROUTING - (NAT, MANGLE)
- パケットがルーティングテーブルを通過した後に処理する
- パケットが送信元または宛先の IP アドレスを変更するために使用する
チェインはルールを作成できるフィルタリングポイントであり、ルールはトラフを通過するパケットに適用される。 ルールは、パケットに対して正確に何が起こるべきかを定義するもので以下のようにターゲットを指定できる。
- ACCEPT ... パケットの許可
- DROP ... パケットをドロップする
- REJECT ... パケットを拒否し、送信者にはICMP警告メッセージを送信する
- LOG ... ログを取る
- MASQUARATE ... NATに使用される
iptablesコマンド
iptablesコマンドは、Linuxシステムでファイアウォールを構成および管理するためのコマンド。 iptablesは、パケットのフィルタリング、NAT (Network Address Translation)、パケットの転送などの機能を提供している。
| オプション | 説明 | | -L <チェーン名> -t <テーブル名> | 指定されたチェーンおよびテーブル内のすべてのルールをリストする。チェーンまたはテーブルが指定されていない場合は、すべてを表示する。 | | -D | 特定のチェーン内のルールを番号によって削除する | | -バツ | チェーンを削除する | | -F (または --flush) | ルールのすべて (または指定されたチェーン) をフラッシュする | | -P | チェーンのデフォルトポリシーを変更する(DROPまたはACCEPTに設定可能) | | -v | 通常は、追加の出力を提供するために -F(または --flush) とともに使用される | | -n | IPアドレスとポートを数値形式で表示する |
# 現在のルールをリストする
iptables -nvL
# ポリシの作成
iptables -P INPUT DROP
# ルールの追加
iptables [-t table] {-A|-C|-D} chain rule-specification
# -A : 選択したチェーンの末尾に 1 つ以上のルールを追加
# -C : 仕様に一致するルールが選択したチェーンに存在するかどうかを確認
# -D : 選択したチェーンから 1 つ以上のルールを削除
# ルールの挿入
iptables [-t table] -I chain [ルール番号] rule-specification
# ルールの削除
iptables [-t table] -D chain ルール番号
# パケットカウンタとバイトカウンタをゼロに設定
iptables [-t table] -Z
/etc/sysconfig/iptables
/etc/sysconfig/iptables
はブート時またはサービスの開始時にカーネルがパケット フィルタリング サービスを設定するために使用する情報が保存されるファイル。
- iptables-save ... iptablesルールを永続保存するためのコマンド
iptables-save > /etc/sysconfig/iptables.$(date +%d-%m-%y)
-c
:パケットカウンタ及びバイトカウンタの現在値を表示-t テーブル
:テーブルを指定
- iptables-restore ... バックアップの設定からiptablesの設定を復元するコマンド
iptables-restore < /etc/sysconfig/iptables.20-09-22
-c
:パケットカウンタ及びバイトカウンタの値を復元-n
:復元する際に現在のテーブル内容を削除しない
iptablesによるIP毎の接続制限
connlimit
ジュールを使用すると、クライアントIP アドレス (またはアドレス ブロック) ごとにサーバーへの並列 TCP 接続の数を制限できる。
これは、サーバ または VPS をフラッディング、スパム、Webスクレイピングから保護するのに役立つといえる。
iptables -A INPUT -p tcp --syn --dport $port -m connlimit --connlimit-above N -j REJECT --reject-with tcp-reset
例は以下の通り。
# クライアントホストごとに3つのSSH接続のみを許可する
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
# IP/ホストごとに20個のHTTP接続までに制限する
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
iptablesによる1秒あたりの接続数制限
state
とrecent
モジュールを使用すると、1秒あたりの接続数制限ができる。
ip6tables
Ip6tables は IPv6 パケット フィルタ ルールのテーブルの設定、維持、および検査に使用される。
9.3.3. 高度なファイアウォール
IPset
IPsetはIPアドレス、ネットワーク範囲、MACアドレス、ポート番号、およびネットワークインターフェイス名の保存されたコレクションであり、 iptablesツールは、IPセットを利用して、より効率的なルール照合を行うことができる。netfilterと連携して使用できる。
利用例としては悪意のある通信元が分かっているアドレスがあるときに、IPセットを作成しiptablesで参照することでルール セットが動的になり、構成が容易になる。
ipsetコマンド
ipsetコマンドはIP セットを作成および変更できるコマンド。
range_setは名称、hashは保存方法、netはデータ型を定義する。
オプションは以下の通り。
オプション | 説明 |
---|---|
create | 新しいIPセットを作成 |
add | IPセットにエントリを追加 |
del | IPセットからエントリを削除 |
destroy | IPセットを破棄 |
list | IPセットの内容をリスト |
flush | IPセット内のすべてのエントリを削除 |
test | 指定したIPがIPセットに含まれているかどうかを確認 |
swap | 2つのIPセットの内容を交換 |
rename | IPセットの名前を変更 |
ipsetの永続化
作成した ipset はメモリに保存され、再起動すると消去される。 ipset を永続的にするには以下コマンドで可能。
復元には以下コマンド。
DMZネットワーク
DMZは組織の内部ローカル エリア ネットワークを信頼できないトラフィックから保護し、セキュリティ層を追加する境界ネットワークのこと。 通常DMZはパブリックインターネットとプライベートネットワークの間にあるサブネットワークを指す。
DMZを設置する目的は以下の通り。
- プライベートネットワークや LAN の安全性を確保しながら、インターネットなどの信頼できないネットワークにアクセスできるようにする
- 外部向けのサービスとリソースに加え、DNS、ファイル転送プロトコル (FTP)、メール、プロキシ、VoIP、および Web サーバーのサーバーを DMZ に設置する
DMZを置くことでハッカーがインターネット経由で組織のデータや内部サーバーに直接アクセスすることがより困難になる
Connection Tracking
ConntrackはLinux カーネルのネットワークスタックの中核機能の1つでカーネルはすべての論理ネットワーク接続またはフローを追跡でき、各フローを構成するすべてのパケットを識別して、それらを一貫して一緒に処理できる機能のこと。
Conntrackは通常、フロー内の最初のパケットのみが完全なネットワークスタック処理を通過して処理を決定する必要があるため、パフォーマンスを向上させる (CPU の削減とパケット遅延の削減)。
設定ファイルは/proc/sys/net/nf_conntrack_max
となる。
またconntrack-toolsパッケージには 2 つのプログラムが含まれている。
conntrack
- 接続追跡システムと対話するためのフル機能のコマンド ライン ユーティリティを提供する
- 既存のフロー エントリを一覧表示、更新、削除できる
conntackd
- ユーザー空間の接続追跡デーモン
- ユーザスペースで動作する
NAT
NATは送信元と宛先の IP アドレスとポートを変更すること。 アドレス変換により、IPv4 パブリック アドレスの必要性が減り、プライベート ネットワーク アドレス範囲が隠蔽される。 このプロセスは通常、ルーターまたはファイアウォールによって実行される。
- SNAT
- ソースのプライベート IP アドレスをパブリック IP アドレスに変換するプロセスのこと
- DNAT
- パケットの IP ヘッダー内の宛先アドレスを変更すること
- インターネット ホストからプライベート ホストにトラフィックをリダイレクトするために使用される
NATにおけるアドレス変換には以下の種類がある。
- 静的NAT ... 1 つのプライベート IP アドレスをパブリック IP アドレスに変換する
- ダイナミックNAT ... プライベート IP アドレスはパブリック IP アドレスのプールにマッピングする
- NPAT(PAT) ... 1 つのパブリック IP アドレスがすべての内部デバイスに使用されますが、各プライベート IP アドレスには異なるポートが割り当てられる
ebtables
ebtablesはイーサネットフレームを検査するルールのテーブル (Linux カーネル内) を設定および維持するために使用されるプログラムのこと。 ebtablesでは、iptablesと同様に「テーブル」「チェイン」「ターゲット」を用いてルールを構築する。
またebtables
のテーブルには以下の3種類がある。
- filter ... Ethernetテーブルのフィルタリング
- nat ... MACアドレスの変更
- broute ... ブリッジ+ルータの機能を実行
Nftables
nftables(ntf)は iptables の代替ツール。 テーブルやチェインなどが予め用意されていたiptablesに対して、nftではユーザが自分で作成する。
ルール作成の手順は以下の通り
- テーブル作成 ...
nft add table
- チェインの作成 ...
nft add chain
- ルールの作成 ...
nft add rule
ルールセットの確認はnft list ruleset
で可能。
9.4. VPN
9.4.1. OpenVPN
OpenVPNは安全なポイントツーポイント接続またはサイト間接続を作成する仮想プライベート ネットワーク (VPN) 技術を実装するOSSソフトウェア。
OpenVPN は、事前共有秘密キー、証明書、ユーザー名/パスワードなどのさまざまな方法を使用して、クライアントがサーバーに対して認証できるようにする。
なおデフォルトではOpenVPNは1194のUDPポートで動作する。
OpenVPNのインストール
ダウンロードする前にIP転送を有効にする必要がある。
RedHat系では以下のようにインストールする。
Easy-RSAの構成
OpenVPNのインストール後、SSL証明書を追加して構築する必要がある。
cd /etc/openvpn/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xvzf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6 easy-rsa
easy-rsaのvarsを作成したら以下ステップを実行する
./easyrsa init-pki
でpkiディレクトリの開始sudo ./easyrsa build-ca
でCA証明書の作成sudo ./easyrsa gen-req myov-server nopass
でキーペアと証明書のリクエストを作成sudo ./easyrsa sign-req server myov-server
でサーバキーに署名するsudo ./easyrsa gen-dh
でキー交換のためのDH鍵を作成する- 上記で作成したファイルを
/etc/openvpn/server/
にコピーする(ca.crt,dh.pem, .key, .crt) sudo ./easyrsa gen-req client nopass
でクライアント キーを取得するsudo ./easyrsa sign-req client client
で生成された CA 証明書を使用してクライアント キーに署名する- 上記で生成したファイルを
/etc/openvpn/client/
にコピーする(ca.crt,client.crt,client.key)
OpenVPNサーバの構築
/etc/openvpn/server/server.conf
にEasy-RSAの構成で構成したファイルをもとに設定ファイルを以下のように記述する。
なお設定は0から作成する必要はなく、/usr/share/doc/openvpn-/sample/sample-config-files/server.conf
に設定ファイルの散歩ウルがあるためそれを利用すると良い。
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/myov-server.crt
key /etc/openvpn/server/myov-server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
duplicate-cn
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
keepalive 20 60
persist-key
persist-tun
compress lz4
daemon
user nobody
group nobody
log-append /var/log/openvpn.log
verb 3
OpenVPNサービスの有効化
以下コマンドを使用してサーバーを起動し、有効にする。
なおこのコマンドにより、正常にVPNサーバが起動すると新しいネットワーク インターフェイスtun0
が作成される。
クライアント構成ファイルの生成
OpenVPNクライアント構成ファイルを生成するには以下.ovpn
ファイルを作成することで可能。ファイル内容は以下のように記述する。
サンプルファイルは/usr/share/doc/openvpn-/sample/sample-config-files/client.conf
に存在するためこのファイルの改造で可能となる。
client
dev tun
proto udp
remote vpn-server-ip 1194
ca ca.crt
cert client.crt
key client.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lz4
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3
ルーティングの構成
以下コマンドでOpenVPNサービスの通信がファイヤーウォールを通過できるようにできる。
firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --add-masquerade
firewall-cmd --permanent --add-masquerade
VPN からの受信トラフィックをローカル ネットワークに転送するようにルーティングを設定するには以下の通り。
routecnf=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $routecnf -j MASQUERADE
変更の有効化/再読み込みはfirewall-cmd --reload
で可能。
クライアントマシンにOpenVPNをインストールする
インストールする
サーバからクライアント構成をコピー
OpenVPNサーバに接続する。
OpenVPNコマンド
openVPNを操作するユーティリティ
9.4.2. IPSecサーバとクライアント操作
IPsec
IPsecは保護されたネットワークと保護されていないネットワークの間に境界を作成する。境界を通過するトラフィックは、IPSec 構成を担当するユーザーまたは管理者によって指定されたアクセス制御の対象になる。
IKE: RFC 7296 で定義されている IKE は、2 つのシステムまたはデバイスが信頼されていないネットワーク上で安全な通信チャネルを確立できるようにするプロトコル。 このプロトコルは、一連のキー交換を使用して、クライアントとサーバーの間に暗号化されたトラフィックを送信できる安全なトンネルを作成する
IPsecのポリシー
IPSecりよるサービスは2つのデータベースによって定義される。 1つがSPD(Security Policy Database)とSAD(Security Association Database)のこと。このポリシは送信元から宛先に送信される各 IP パケットに適用される。
セキュリティアソシエーション
セキュリティアソシエーションは両方のノードが認証および暗号化メカニズムに関する情報を交換するための概念で、送信者と受信者の間で伝送されるトラフィックにセキュリティ サービスを提供する。
IPsecのアーキテクチャではセキュリティアソシエーションを識別するパラメータは3つある。
- SPI(Security Parameter Index)、受信側システムが受信パケットを選択するためのIPSecプロトコルヘッダを伝えるビット文字列
- IP宛先アドレス、IPSecのエンドポイントアドレス
- セキュリティプロトコル識別子
SAD(Security Association Database)
SPD(Security Policy Database)
IPSecプロトコル
IPSecではAH(プロトコル認証ヘッダ)、ESP(カプセル化セキュリティペイロード)の2つのプロトコルを使用してトラフィックセキュリティサービスを提供する。
- プロトコル認証ヘッダ (AH)
- IP ヘッダーとデータ ペイロードがハッシュされるために使用
- ハッシュから新しい AH ヘッダーが構築され、パケットに追加される
- 認証機能と未改竄の保証
- セキュリティペイロードのカプセル化 (ESP)
- データ パケットの暗号化と整合性を提供するセキュリティ プロトコル
- 標準 IP ヘッダーの後に追加される
- AHの機能+暗号化
IPSec暗号化の技術
IPSecのセキュリティアソシエーションではトンネルモードとトランスポートモードの2つのモードの操作を設定できる。
- トンネルモード
- ペイロードとヘッダーの両方が暗号化される
- ゲートウェイ間、またはエンド ステーションからゲートウェイへの使用が一般的
- パケットの送信元がセキュリティを提供するデバイスと異なる場合は、トンネル モードが使用
- トランスポートモード
- 各パケットのデータ部分のみが暗号化される
- エンド ステーション間、またはエンド ステーションとゲートウェイの間に適用できる
IPSecのトラフィック処理
Racoon
RacoonはIPsec IKE プロトコルのキー交換デーモンのこと。
設定ファイルは/etc/racoon/racoon.conf
となる。
setkey
setkeyはIPsecにおける二つのデータベース(SAD、SPD)を操作するためのユーティリティ。
ipsec-tools
ipsec-tools
はIPsec接続を確立するために必要なユーティリティ。
なお現在はRedHat系OSではIPsec-toolsは使用されておらず、LibreSwanといったツールでVPNが構成されている。
設定ファイルは/etc/ipsec-tools.conf
となる。
9.4.3. StrongSwan
StrongSwan はIPsec ベースのOSSのVPN。 StrongSwan は元々 Linux 用に設計されたが、その後 Android、FreeBSD、Mac OS X、Windows およびその他のプラットフォームに移植された。特徴は以下の通り。
- 構成がシンプル
- 強力な暗号化と認証方法の提供
- 大規模で複雑なVPNネットワークをサポートする
- 拡張性に優れたモジュラー設計
StrongSwanのインストール
strongsan.conf
strongswanの設定ファイル。
# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included files
charon {
load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
}
include strongswan.d/*.conf
swanctl
swanctlはインターフェイス プラグインを介して StrongSwan IKE デーモン ( charon )を設定、制御、監視するためのコマンドライン。
swanctl.conf
9.4.4. WireGuard
WireGuardは非常にシンプルで高速な最新の VPN 。 OpenVPN よりも大幅にパフォーマンスが向上している。
Wireguardのインストール
Wireguard サーバの構成
適切な権限を持つ Wireguard 設定用の空の構成ファイルをサーバー上に作成する。
ディレクトリを作成した後、wg
および`tee
コマンドライン ツールを使用して公開キーと秘密キーを作成する。
次に、VPN トラフィックをルーティングするためにトンネル デバイスを設定する必要があり、/etc/wireguard
以下にwg0.conf
等を作成する必要がある。
[Interface]
## IP Address of VPN server ##
Address = 192.168.108.101/24
## Save the configuration when a new client will add ##
SaveConfig = true
## port number of VPN server ##
ListenPort = 51820
## Private Key of VPN Server ##
PrivateKey = SERVER_PRIVATE_KEY
## Command to be executed before starting the interface ##
PostUp = firewall-cmd --zone=public --add-port 51820/udp && firewall-cmd --zone=public --add-masquerade
## Command to be executed before turning off the interface ##
PostDown = firewall-cmd --remove-port 51820/udp --zone=public && firewall-cmd --remove-masquerade --zone=public
インターフェイスはsudo wg-quick up wg0
コマンドで起動する。
またsudo systemctl enable wg-quick@wg0
で有効化できる。
wgコマンド
wgはWireGuard トンネル インターフェイスの構成を取得および設定するための構成ユーティリティ。 インターフェイス自体は を使用して追加および削除でき、その IP アドレスとルーティング テーブルはと をip-link(8)使用して設定できる。
サブコマンド | 説明 |
---|---|
show | 現在の構成とデバイス情報を表示する |
showconf | 指定された WireGuard インターフェイスの現在の設定を表示する |
set | 現在の構成の変更、ピアの追加、ピアの削除、またはピアの変更 |
IPv4転送の有効化
NATのIPv4転送の有効化には/etc/sysctl.d
に99-custom.conf
を作成する。
## for enabling IPv4 forwarding ##
net.ipv4.ip_forward = 1
## for enabling IPv6 forwarding ##
#net.ipv6.conf.all.forwarding = 1
Wireguard クライアントの構成
手順はサーバの時と同じで、設定ファイルのみが少し異なる。
[Interface]
## Private Key of VPN Client ##
PrivateKey = qCi5ugILVhTOOmCzchqFzkNaHM3HP1qFUWgtYun2A3w=
## IP address of VPN Client ##
Address = 192.168.108.102/24
[Peer]
## Public Key of Rocky 8 VPN Server ##
PublicKey = m58H6KTuRt+4z6g+jMIeRCdAkQoikkiVvTd7pJvrPGE=
## set ACL ##
AllowedIPs = 0.0.0.0/0
## IP address and Port of CentOS 8 VPN Server ##
Endpoint = 192.168.108.101:51820
なお起動後に、WireGuardサーバにVPN クライアント マシンの IP アドレスと公開キーを登録する必要がある。
[Peer]
## Public Key of VPN Client ##
PublicKey = 73gw+v4V0TKsw2uGLHJ9EI26qfMEwvk+JZ+xED2ttAs=
## IP Address of VPN Client ##
AllowedIPs = 192.168.108.102/32
wg-quickコマンド
wg-quickはWireGuardインターフェイスを起動するコマンド。