13. システムセキュリティ
13.1. パケットフィルタリング
パケットフィルタリングはカーネルが処理するパケット情報を調べて通過させたり遮断させたりすること。 パケットフィルタリングはINPUT(入力),OUTPUT(出力),FORWARD(転送)の3か所で行う。 それぞれINPUTチェイン、OUTPUTチェイン、FORWARDチェインと呼ばれる。
なおチェインはパケットを検査するためのルールセットのこと。 ネットワークインターフェイスを通過するパケットはチェインのルールに適合する検査され、破棄されたり通過させたりされる。 チェインのいくつか集めたセットはテーブルと呼ばれる。 テーブルには以下の種類がある。
テーブル | デフォルトチェイン |
---|---|
filter | INPUT, OUTPUT, FORWARD |
nat | PREROUTING, POSTROUTING, OUTPUT |
mangle | INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING |
13.1.1. iptablesコマンド
iptablesコマンドはパケットフィルタリングやNAT(ネットワークアドレス変換)の設定を行うコマンド。 書式は以下の通り。
# チェインの最後にルールの追加/削除
iptables -[AD] チェイン ルール
# チェインのポリシ変更
iptables -P チェイン ターゲット
# ユーザ定義チェインの一覧表示/強制全削除/作成/削除
iptables -[LFNX] チェイン
# NATテーブルの表示
iptables -t NAT -L
# チェインにルールを挿入
iptables -I チェイン [ルール番号] ルール
オプション | 説明 |
---|---|
-v | 詳細に表示する |
-n | 数値で表示する |
--line-numbers | ルール番号を表示する |
コマンド | 説明 |
---|---|
-A | 指定したチェインの最後にルールを追加 |
-D | 指定したチェインの最後のルールを削除 |
-P | 指定したチェインのポリシ変更を行う |
-L [チェイン] | ルールのリストを表示する |
-N チェイン | 指定した名前のユーザ定義チェインを作成 |
-X チェイン | 指定した名前のユーザ定義チェインを削除 |
-l | ルール番号を指定してルールを挿入 |
-F チェイン | 指定したチェインのルールをすべて削除 |
チェイン | 説明 |
---|---|
INPUT | ホストに入ってくるパケット |
OUTPUT | ローカルマシンで生成されたパケット |
FORWARD | ホストを経由するパケット |
PREROUTING | 入ってきたパケットの変換 |
POSTROUTING | 出ていくパケットの変換 |
ターゲット | 説明 |
---|---|
ACCEPT | パケット通過の許可 |
DROP | パケットを破棄 |
REJECT | パケットを拒否(送信元に通知する) |
MASQUERADE | 送信元IPアドレスのポート番号変換 |
SNAT | 送信元IPアドレスの変換 |
DNAT | 送信元IPアドレスの変換 |
LOG | ログに出力 |
ルール | 説明 |
---|---|
-s 送信元 | 送信元IPアドレス |
-d 送信元 | 送信元IPアドレス |
--sport ポート番号 | 送信元ポート番号 |
--dport ポート番号 | 送信元ポート番号 |
--to | 宛先指定(IPアドレス:ポート番号) |
-j ターゲット | 適用されるターゲット |
-p プロトコル | プロトコル(tcp,udp,icmp,all) |
-i インターフェイス名 | 入力インターフェースの指定 |
o インターフェース名 | 出力インターフェースの指定 |
使用例は以下の通り。
# FORWARDチェインのポリシーをDROP変更
iptables -P FORWARD DROP
# 特定のIPからのICMPパケットを拒否する
iptables -A INPUT -p icmp -s 192.168.2.0/24 -j REJECT
# パケットフィルタリングの挙動をログに保存する(journalctlなどで確認可能)
iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "Telnet Trying ..."
iptables -A INPUT -p tcp --dport 23 -j DROP
iptables設定の保存
各ディストリビューションにおけるiptablesの保存方法は以下の通り。
# RedHat系
service iptables save
iptables-save > /etc/sysconfig/iptables
# Debian系
iptables-save > /etc/iptables/rules.v4
iptables設定の復元
iptables設定の復元はiptables-restore
コマンドで行う。
firewalld
CentOS7系やUbuntu22.04などではFWの仕組みにfirewalldが採択されている。 そのためデフォルトではiptablesを利用できない。
この場合利用するとき、firewalldサービスを停止しiptables-serviceパッケージをインストールする必要がある。
なおUbuntuなどではiptables
コマンドではなくufw
コマンドを用いてFWの設定を行うのが一般的となる。
13.1.2. ポート転送
ポート転送は外部から届いたパケットの送信先ポート番号を変えて内部に転送すること。 以下に、外部(eth1)、内部(172.16.0.0/16)の172.16.0.2の80ポートに届くようにする際の設定例を記載する。
iptables -A FORWARD -d 172.16.0.2 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth0 -j DNAT --to 172.16.0.2:80
13.1.3. ip6tablesコマンド
IPv6の場合にパケットフィルタリングの設定を行うコマンド。
使い方はip6tables
コマンドとほぼ同じとなっている。
iptables設定の保存
各ディストリビューションにおけるip6tablesの保存方法は以下の通り。
# RedHat系
service ip6tables save
ip6tables-save > /etc/sysconfig/ip6tables
# Debian系
ip6tables-save > /etc/iptables/rules.v6
13.2. ルータの構成
Linuxホストをルータとして利用することもできる。 ルータとして使用するにはルーティングテーブルを適切に設定する必要がある。
13.2.1. ルーティングテーブル
route/netstat -rコマンド
route
コマンドやnetstat -r
コマンドはルーティングテーブルを表示するコマンド。
ルーティングテーブルに表示されるエントリには静的経路、動的経路がある。
- 静的経路 ...
route
コマンドにより設定される経路 - 動的経路 ... ルータ同士が情報交換することで自律的形成される経路
Linuxで動作するルーティングソフトにはQuaggaがある。 なお動的経路を使用しない場合はパケットフィルタリングのiptablesのみで十分となる。
Linuxをルータとして使用する場合は以下ファイルの値が1である必要がある。
- IPv4の場合 ...
/proc/sys/net/ipv4/ip_forward
- IPv6の場合 ...
/proc/sys/net/ipv6/conf/all/forwarding
上記設定のみではシステム再起動後に設定が初期化されるので、/etc/sysctl.conf
ファイルや/etc/sysconfig/network
ファイルにFORWARD_IPv4=yesやnet.ipv4.ip_forward=1など記述する必要がある。
13.2.2. IPマスカレード
IPマスカレードはLAN側ホストがインターネットを利用する際にIPアドレスをグローバルアドレスに変換したり、その逆を行う機能のこと。
IPマスカレード設定をLinuxで行う場合はiptables
で以下のように設定する。
設定例は以下の通り。
13.3. FTPサーバのセキュリティ
Linux/Unix系OSで使用されているFTPサーバにはwu-ftpdや設定が容易であるProFTPDや、安全性の高いvsftpd、セキュリティと実用性重視のPure-FTPDなどがある。
13.3.1. ProFTPD
ProFTPDはproftpd.conf
で設定を行う。
なお書式はApacheの設定と似ているため設定しやすい。
# アクセス時表示のサーバ名
ServerName "ProFTPD Default Installation"
# デーモン(standalone)かスーパーサーバ(inetd)経由かを指定
ServerType standalone
# バージョンを隠す
ServerIdent No
# Rootログインを許可しない
RootLogin Off
# ホームディレクトリより上のディレクトリに移動禁止
DefaultRoot
# PAM認証
AuthPAMAuthorization on
# タイムアウトするまでの秒数
TimeoutIdle 120
# ポート番号
Port 21
# Umask値
Umask 022
# 最大接続クライアント数
maxClientPerHost 10
# 最大子プロセス数
MaxInstances 30
# 子プロセスの実行ユーザ/実行グループ
User nobody
Group nobody
<Global>
# ファイル上書きファイル転送の許可
AllowOverwrite yes
<Limit All SITE_CHMOD>
# 全てのFTPコマンドとアクセス権限の変更
AllowAll
</Limit>
</Global>
# 読み取りは許可/書き込みは禁止
<Limit READ>
AllowAll
</Limit>
<Limit STOR>
DenyAll
</Limit>
# 全てのIPアドレスからのログイン許可
<Limit LOGIN>
Order Deny.Allow
Allow from all
</Limit>
# 匿名ログインの同時接続ユーザ数と超過メッセージ
MaxClients 100 "Sorry, max %m users -- try again later"
# ファイル転送ログ
TransferLog /var/log/proftpd/xferlog/legacy
アクセス制御はLimitディレクティブで行う。 Limitディレクティブにはアクセス制御ディレクティブやFTPコマンド/FTPコマンドグループを記述できる。
アクセス制御ディレクティブ | 説明 |
---|---|
Order Allow,deny/deny.allow | AllowとDenyがチェックされる順序 |
Allow from 場所 | 許可するホストやネットワーク設定 |
AllowAll | 許可を明示 |
AllowUser | 許可するユーザ |
AllowGroup | 許可するグループ |
Deny from 場所 | 拒否するホストやネットワーク設定 |
DenyAll | 拒否を明示 |
DenyUser | 拒否するユーザ |
DenyGroup | 拒否するグループ |
FTPコマンド | 説明 |
---|---|
RETR | サーバからクライアントへのファイル転送 |
STOR | クライアントからサーバへのファイル転送 |
REN | ファイル名変更 |
DELE | ファイル削除 |
RMD | ディレクトリ削除 |
SITE_CHMOD | パーミッション変更 |
FTPコマンドグループ | 説明 |
---|---|
DIRS | ファイル一覧の取得 |
READ | ファイルの読み取り |
WRITE | ファイル/ディレクトリの作成/削除 |
ALL | すべてのFTPコマンド |
LOGIN | ログイン |
13.3.2. vsftpd
vsftpdの設定はvsftpd.conf
で設定を行う。
# ローカルユーザログインの許可
local_enable=Yes
# 書き込みを許可
write_enable=Yes
# umask値を022にする
local_umask=022
# 20番ポートからの送信接続
connect_from_port_20=YES
# ファイル転送ログを残す
xferlog_enable=YES
# ファイル転送ログファイル
xferlog_file=/var/log/vsftpd.log
# ログファイルの形式(YESの場合はwu-ftpdと同様の形式)
xferlog_std_format=NO
13.3.3. FTPサーバのアクセス制御
FTPログインを許可しないユーザの指定は/etc/ftpusers
にユーザリストを記述する。
主にrootユーザやシステムアカウントを記述すると良い。
chroot機能で特定のディレクトリ以外のディレクトリにユーザが移動することを禁止できる。 これはセキュリティ上重要な設定となる。
- proftpd.confの場合
DefaultRoot ~
- vsftpd.confの場合
chroot_local_user=YES
chroot_list_file=/etc/vsftpd.chroot_List
13.3.4. Pure-FTPD
Pure-FTPDの場合はpure-ftpd.conf
で設定を行う他、起動時のオプションで動作を指定することもできる。
オプション | 説明 |
---|---|
-4 | IPv4のみの利用 |
-A | 全ユーザにchrootの利用 |
-B | デーモンとして動作する |
-c 数 | 最大クライアント数 |
-C 数 | IPアドレスあたりの最大クライアント数 |
-e | 匿名ユーザのみログインを許可する |
-E | 匿名ユーザの利用拒否 |
-i | 匿名ユーザにファイルのアップロードを禁止する |
# 全ユーザに対してchrootを適用
ChrootEveryone yes
# 最大クライアント数
MaxClientsNumber 50
# IPアドレス当たりの最大クライアント数
MaxClientPerIP 8
# Yesでデーモン動作、Noでxinitd経由(スーパーデーモン)
Daemonize yes
# ドットファイルの表示の有無
DisplayDotFiles yes
# PureDBの利用
PureDB /etc/pure-ftpd/pureftpd.pdb
# PAM認証の利用有無
PAMAuthentication no
13.2.5. パッシブモード
通常FTPサーバはデータ転送に20/21番ポートを使用し、一般的にはクライアントからサーバ側へ接続要求を行う。 FTPのデータ転送に関してはFTPサーバ側からクライアントに接続要求するアクテイブモードと言われる方法となる。
この場合クライアント側のFWの設定なので接続できない場合があるためパッシブモードでFTPサーバを動作させることで回避できる。 パッシブモードではデータ転送の際にクライアント側からサーバへ接続要求することができる。
各サーバにおけるパッシブモードの設定方法は以下の通り。
13.2.6. 匿名FTPサーバ
匿名FTPサーバ(Annonymous FTP)は匿名でFTPサーバを利用できるようにすること。 この場合chrootにより権限のないディレクトリにアクセスできないようにすることが重要となる。
方法としては以下の通り。
/home/ftp
などのディレクトリを作成する/bin
,/lib
,/etc
などを作成しFTPサービス運営に必要なファイルをコピーする- anonnymousユーザ用のディレクトリ(
/home/ftp/pub
)などを作成する /home/ftp
にchrootする
上記手順により他のディレクトリにannonymousユーザはアクセスできなくなる。
# proftpdの場合
<Anonymous ~ftp>
User ftp
Group ftp
# ダウンロードのみ許可
<Limit READ>
AllowAll
</Limit>
<Limit STOR>
DenyAll
<Limit>
</Anonymous>
# vsftpdの場合
# 匿名FTPの許可
anonymous_enable=YES
# 匿名ユーザによるアップロード禁止
anon_upload_enable=NO
# 匿名ユーザによるディレクトリ作成などを禁止
anon_mkdir_write_enable=NO
13.4. OpenSSH
SSHはリモートホスト通信において高いセキュリティで実現するものといえる。 LinuxではOpenBSDによるSSH実装であるOpenSSHが一般的に利用される。 SSHにはVer1.0とVer2.0系があり、それぞれ公開鍵認証のアルゴリズム形式が異なる。
SSHのバージョン | 公開鍵認証のアルゴリズム |
---|---|
1.0系 | RSA |
2.0系 | DSA, ECDSA, ED25519, RSA |
13.4.1. SSH設定
SSHサーバ機能はsshdデーモンにより提供される。
設定ファイルは/etc/ssh/sshd_config
となる。
主要な設定項目は以下の通り。
設定項目 | 説明 |
---|---|
Port | SSHで使うポートの設定 |
Protocol | 使用するSSHのバージョン |
ListenAddredd | 接続受付アドレス(0.0.0.0ですべて) |
HostKey | ホスト鍵のファイルパス |
SyslogFacilty | ログのファシリティ |
LogLevel | ログのプライオリティ |
LogGraceTime | ログインを試みることのできる最大時間(秒) |
PermitRootLogin | rootログインの禁止許可 |
StrictModdes | パーミッションを厳密にチェックするかどうか |
MaxAuthTimes | 認証を試みることのできる最大数 |
RSAAuthentication | SSH1で公開鍵認証を許可するかどうか |
PubkeyAuthentication | SSH2で公開鍵認証を許可するかどうか |
AuthorizedKeysFile | 公開鍵を登録するファイル |
PasswordAuthentication | パスワード認証の有効/無効化 |
PermitEmptyPasswords | 空パスワードの有効/無効 |
ChallengeResponseAuthentication | チャレンジレスポンス認証の有効/無効化 |
UsePAM | PAMを使用する |
X11Forwarding | X11フォワーディングの無効/有効化 |
AllowUsers | ログインを許可するユーザ |
DenyUsers | ログインを禁止するユーザ |
AllowGroups | ログインを許可するグループ |
DenyGroups | ログインを許可するグループ |
SubSystem | 外部サブシステムの指定(ファイル転送デーモンなど) |
また/etc/ssh/sshd_config
の設定例は以下の通り。
Port 22
Protocol 2
ListenAddress 0.0.0.0
HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
SyslogFacility AUTHPRIV
LogLevel INFO
LOGGraceTime 2m
PermitRootLogin no
StrictMode yes
MaxAuthTries 6
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no
UsePAM yes
X11Forwarding yes
# SFTPを行う場合の設定
Subsystem sftp /usr/libexec/openssh/sftp-server
13.4.2. ホスト認証/ユーザ認証
SSHでは最初にユーザ認証の前にホストの正当性を確認するホスト認証が行われる。
ホスト認証
ホスト認証は接続先ホストの正当性を確認する検証。 DNSサーバのクラックなど不正なホストに接続されてしまう場合などの対策のために実装されている。 具体的には公開鍵暗号方式を用いることでホストの正当性を保証する。
具体的には公開鍵と秘密鍵を用いて認証を行う。
OpenSSHのインストールでローカルホスト用の公開鍵と秘密鍵が生成される。
このとき秘密鍵は外部に漏れないように厳重に管理する。
なお生成されたファイルは/etc/ssh/
以下に保存される。
ファイル名 | 説明 |
---|---|
ssh_host_key | 秘密鍵(Ver1.0) |
ssh_host_dsa_key | 秘密鍵(Ver2.0 DSA用) |
ssh_host_rsa_key | 秘密鍵(Ver2.0 RSA用) |
ssh_host_key.pub | 公開鍵(Ver1.0) |
ssh_host_dsa_key.pub | 公開鍵(Ver2.0 DSA用) |
ssh_host_rsa_key.pub | 公開鍵(Ver2.0 RSA用) |
ssh_host_ecdsa_key | 秘密鍵(Ver2.0 ECDSA用) |
ssh_host_ecdsa_key.pub | 公開鍵(Ver2.0 ECDSA用) |
ssh_host_2d25519_key | 秘密鍵(Ver2.0 ED25519用) |
ssh_host_2d25519_key.pub | 公開鍵(Ver2.0 ED25519用) |
SSH接続時にホストの公開鍵がクライアント側に送られる。 このときクライアントは所持するホスト鍵と一致することでホストの正当性を確認する。
ホスト鍵は~/.ssh/known_hosts
に格納される。
検証するときにフィンガープリントをクライアント側に登録しておけばサーバに正当性があるかどうか検証できる。
サーバ側の鍵でフィンガープリントは以下のように確認できる。
2回目以降の接続は接続先から送られたホスト鍵をKnown_hosts内の鍵と比較し問題がないとユーザ認証に進むこととなる。 そのためこの段階で接続先が悪意あるものによりなりすましされていたら警告が出るようになる。
13.4.3. 公開鍵認証
SSHではホスト認証後にユーザ認証に進む。 ユーザ認証では公開鍵認証が試行される。 公開鍵認証の手順は以下の通り。
- サーバ側に公開鍵を登録する
- SSH接続時に公開鍵が利用できるか確認が行われる
- クライアント側は公開鍵にユーザ名などの情報を加え、秘密鍵で署名しサーバに送信する
- サーバはユーザの公開鍵を使用して署名を確認する
- 確認できるとログインを許可する
なおユーザの公開鍵と秘密鍵ペアの生成にはssh-keygen
コマンドを使用する。
ssh-keygenコマンド
公開鍵と秘密鍵のペアを作成するコマンド。
オプション | 説明 |
---|---|
-f ファイル名 | 鍵ファイル名の指定 |
-t | 暗号化方式の指定(rsa1, dsa, rsa,ecdsa, ed25519) |
-p | 既存の鍵ファイルのパスフレーズを変更する |
-P パスフレーズ | 古いパスフレーズを指定する |
-N パスフレーズ | 新しいパスフレーズを指定する |
-l | フィンガープリントの表示 |
-R ホスト名 | 指定されたホスト鍵をknown_hostsから削除する |
生成される鍵のデフォルト名は以下の通り。
バージョン | 秘密鍵 | 公開鍵 |
---|---|---|
Ver1.0 | identity | identyty.pub |
Ver2.0(DSA) | id_dsa | id_dsa.pub |
Ver2.0(RSA) | id_rsa | id_rsa.pub |
Ver2.0(ECDSA) | id_ecdsa | id_ecdsa.pub |
Ver2.0(ED25519) | id_ed25519 | id_ed25519.pub |
ユーザの公開鍵を接続先に登録する
ssh-keygen
コマンドで公開鍵ファイルを作成した後、接続先ホストの~/.ssh/authorized_keys
に登録する。
この際はコマンドを利用する場合はscp
コマンドなどで転送する。
なお公開鍵は保存するauthorized_keys
ファイルは所有者のみ読み書きできるようにしておく。
13.4.4. ssh-agent
ssh-agentは秘密鍵使用時に尋ねられるパスフレーズの入力の手間を省く機能のこと。 ssh-agentはクライアント側で稼働するデーモンで、秘密鍵をメモリ上に保持しておき、必要時にそれを利用する仕組みとなっている。 そのため毎度パスフレーズを打つ必要がない。
ssh-agentの利用にはssh-agentの子プロセスにbashを起動し、ssh-add
コマンドで秘密鍵を登録する。
この設定以降、このbashや子プロセスではパスフレーズの入力が不要となる。
ssh-agentが保持している秘密鍵の一覧はssh-add -l
コマンドで確認できる。
13.4.5. SSHポート転送
SSHポート転送(SSHポートフォワーディング)はあるポートに送られてきたTCPパケットをSSHを使用した安全経路でリモートホストの任意ポートに転送すること。 この機能によりPOP、FTPなどの暗号化されていないプロトコルを使った通信の安全性を高めることができる。
ポート転送を行う場合のssh書式は以下の通り。
13.4.6. SSHサーバのセキュリティ
SSHサーバをデフォルト設定ではなく、適切に設定するとよりセキュアな運用ができる。 項目は以下の通り。
- SSH Version1.0の禁止
- パスワード認証の禁止
- rootログインの禁止
- 接続元制限
SSH Version1.0の禁止
SSHバージョン2.0のみを許可することで、SSHバージョン1.0の脆弱性を防ぐことができる。
sshd_config
のProtocol 2
にすることで可能。
パスワード認証の禁止
パスワード認証は原則は無効にした方がよい。 これはブルートフォースアタックやパスワードが知られる危険性があるためである。
同様にsshd_config
でPasswordAuthentication no
と記述する。
rootログインの禁止
rootユーザのリモートログインも基本は許可すべきではない。
sshd_config
でPermitRootLogin no
と記述することでrootログインを禁止にできる。
ログインユーザの制限
ユーザ単位でログイン制限することが可能。 AllowUsersディレクティブでユーザを指定すると、指定していないユーザのログインは禁止にできる。
書式 | 説明 |
---|---|
AllowUsers [ユーザ名] | ユーザのみログインを許可 |
AllowUsers [ユーザ名1] [ユーザ名2] | ユーザ1, ユーザ2をログインを許可 |
AllowUsers [ユーザ名]@172.16.0.1 | 172.16.0.1のユーザのみログインを許可 |
AllowUsers [ユーザ名]@example.com | example.comのユーザのみをログイン許可 |
AllowUsers *@172.16.0.1 | ホストが172.16.0.1のユーザのみログイン許可 |
AllowGroups wheel admin | グループがwheelとadminユーザのみ許可 |
接続元の制限
SSHアクセスは/etc/hosts.allow
や/etc/hosts.deny
で制御できる。
これはsshdが通常TCP Wrapper機能を参照しているからとなる。
前提にlibwrapという機能が利用されている必要があるので確認は以下コマンドで可能。
13.5. セキュリティの設定
13.5.1. セキュリティツール
Snort
Snortはネットワークインターフェイス上のトラフィックを監視しパケットをいろんな規則と照合することで攻撃や侵入を捕らえられるIDSツール。 Snortが参照するルールセットはインターネット上で入手することができる。 またSnortの使用にはパケットキャプチャであるlibcapが必要となる。
Tripwire
Tripwireはファイルシステムの状況を記録し比較することでファイル改ざんを検知するプログラム。 検知はリアルタイムではなくcronにより定期的なスケジューリングにより起動する。 インストールと設定方法は以下の通り。
- パッケージ/ソースからインストール
- ポリシーファイルの作成
- ベースラインデータベースの作成
- 定期的チェック
- 必要に応じたポリシーファイル/ベースラインデータベースのアップデート
なおTripWireでは以下項目をチェックできる。
- ファイルタイプ
- リンク数
- パーミッション
- iノード番号
- 所有ユーザ
- iノードのタイムスタンプ
- 所有グループ
- iノードのあるデバイスID
- アクセス時刻
- MD5/SHA/Haval/CRC32ハッシュ値
- ファイル更新日時
- ブロック数
- ファイルサイズ
OpenVAS
OpenVASはOSSのセキュリティスキャナーでネットワーク経由で脆弱性チェックできるツール。 OpenVASは以下のコンポーネントで構成される。
コンポーネント | 説明 |
---|---|
OpenVAS Scanner | セキュリティスキャナ |
OpenVAS Manager | スキャナ/スキャンタスク/データ管理ソフトウェア |
OpenVAS Administrator | サービスやユーザを管理するソフトウェア |
Greebone Security Asiistant | WEBブラウザベースで操作するインターフェイス |
Greebone Security Desktop | GUIベースのクライアント |
OpenVAS CLI | コマンドラインベースのクライアント |
Fail2ban
Failbanはログファイルを監視し攻撃を検知し、攻撃元IPを遮断するソフトウェア。 内部的には一定時間内に何度もログインを失敗するといったイベントにより、iptablesルールを書き換えアクセス元からの接続を遮断する。
13.5.2. 開いているポートの確認
Nmap
Nmapはポートスキャンツールで、開いているポートから稼働しているサービスを特定できる。
オプション | 説明 |
---|---|
-sT | 接続スキャン |
-sS | SYNスキャン(TCP接続のSYNパケットを送信し、SYN+ACKが帰るかどうかでポートスキャンを行う) |
-sN | Nullスキャン |
-sF | FINスキャン |
-sX | Xmasスキャン |
-sR | RFCスキャン |
-O | OSを調べる |
XmasツリースキャンというTCPヘッダのFIN、URQ、PSHフラグを有効にしたパケットを送って藩のを確かめる手法も利用できる。
netstat/ss/lsof/fuserコマンド
netstat,ss,,lsof,fuserコマンドも同様に開いているポートを確認できる。
13.5.3. TCP Wrapper
TCP Wrapperは各種サーバプログラムへのアクセス制御を集中管理する仕組み。
libwrapライブラリにより機能が提供される。
アクセス制御は/etc/hosts.allow
や/etc/hosts.deny
に記述すことで可能。
これらのファイルで使えるワイルドカードは以下の通り。
ワイルドカード | 意味 |
---|---|
ALL | 全てのサービス/ホスト |
A EXCEPT B | B以外のA |
LOCAL | 「.」を含まないすべてのホスト(ローカルセグメントのホスト) |
PARANOID | ホスト名からDNS検索したアドレスとサービス要求元アドレスが不一致 |
ローカルネットワークからすべてのsshdへのアクセスを許可する記述は/etc/hosts.allow
に以下のように記述する。
またspawn
を使い特定のコマンドを実行させることもできる。
13.5.4. セキュリティ情報
セキュリティの情報源には以下のようなものがある。
CERT/CC
セキュリティ事故情報を収集しセキュリティに関する技術支援情報を発信しているサイト。
- CERT/CC ... https://www.cert.org
- JPCERT... https://www.jpcert.or.jp
BUGTRAQ
BUGTRUGはバグ情報を公開するためのメーリングリスト。
CIAC
CIACは米エネルギー省が運営するサイトで、セキュリティインシデントの報告を行っている。
13.5.5. インシデントへの対処
サーバがクラックされると以下のことが行われる可能性がある。
- コマンドの改ざん
- ログ改ざんやsyslog停止
- 悪意のあるソフトウェアのインストールと使用
改ざんされたls
コマンドでは不正なファイルのみを表示しないようにしてある場合があり、この場合はecho *
コマンドによりlsを代用できる。
またファイル改ざんのチェックはrpm
コマンドにより確認できる。
このオプションはイストール時のファイルの状態と現状を比較し、差があればプロパティと一緒に表示する。 表示されるRPM検証記号は以下の通り。
記号 | 説明 |
---|---|
S | ファイルサイズが異なる |
M | アクセス権またはファイルタイプの変更がされている |
5 | MD5チェックサムの値が異なる |
L | シンボリックリンクが変更されている |
U | 所有者が変更されている |
G | 所有グループが変更されている |
T | ファイルの更新時刻が異なる |
D | デバイスファイルが変更されている |
? | 不明 |
c | 設定ファイルを表す |
13.6. OpenVPN
VPNはインターネットなどの公衆ネットワークを介して、まるで専用線で接続されているようにプライベートなネットワークを構築するサービスのこと。 VPNでは暗号化した経路を使用することで安全に通信ができることを実現している。
13.6.1. OpenVPNとは
OpenVPNはLinuxでVPNを通す際に選択されるVPNの1つ。 OpenVPNではL2/L3プロトコルをSSL/TLSでカプセル化しOpenVPNサーバとOpenVPNクライアントを接続する。
OpenVPNでは公開鍵基盤(PKI)を使用する。 CA(認証局)、OpenVPNサーバ、OpenVPNクライアントそれぞれで必要になるファイルを以下にまとめる。
サイド | 必要ファイル |
---|---|
CA | CA証明書、CA秘密鍵 |
OpenVPNサーバ | CA証明書、サーバ証明書、サーバ秘密鍵、DHパラメータ |
OpenVPNクライアント | CA証明書、クライアント証明書、クライアント秘密鍵 |
なおCAを自己証明で行う場合は、CA秘密鍵はOpenVPNサーバに設置する。
またOpenVPNのクライアント-サーバ接続形態にはルーティング接続とブリッジ接続がある。 これらはネットワーク1からネットワーク2に対してVPN接続をした際の、ネットワーク2への接続の行われ方が異なる。
ルーティング接続
仮想トンネルネットワークを通して異なるネットワークに接続する方法。 VPNクライアントのネットワークにアクセスする際には、VPNサーバや他のルータを経由して(ルーティングして)アクセスすることになる。
特徴は以下の通り。
- OpenVPNサーバ/クライアントは別々のネットワークが利用できる
- LAN同士を接続する用途に向いている
- 大規模アクセス向き
ブリッジ接続
仮想インターフェイス経由で接続する方法。
接続先ネットワークと同じネットワークセグメントのIPアドレスをOpenVPNクライアントの仮想インターフェイス(TAP)に割り当てることでOpenVPNクライアントは接続先ネットワークに参加できる。
特徴は以下の通り。
- ブロードキャストが届く
- 小規模ネットワーク/個人向き
13.6.2. 必要となるファイルの作成
OpenVPNで必要となる各ファイルは用意されたスクリプトで作成する。
パラメータの準備
サーバ証明書やCA証明書の作成にはいくつかパラメータを指定する必要がある。
何度も入力するの晴れ間なので/etc/openvpn/vars
を編集してパラメータを書き換える。
設定したファイルを読み込み不要なファイルは削除する。
CA証明書/CA秘密鍵の作成
認証用のCA証明書とCA秘密鍵を作成する。
上記コマンドでCA証明書ファイルca.crt
とCA秘密鍵ファイルca.key
が作成される。
これらのファイルは/etc/openvpn/keys
に配置する。
またCA証明書ca.crt
はOpenVPNサーバ/クライアントの/etc/opnvpn/keys
にも配置する。
サーバ証明書/サーバ秘密鍵の作成
OpenVPNサーバ用のサーバ証明書と秘密鍵を作成する。
引数にはホスト名orファイル名を指定する。
上記例の場合はサーバ証明書のserver.crt
とサーバ秘密鍵のserver.key
が生成される。
これらのファイルはOpenVPNサーバの/etc/openvpn/keys
に配置する。
DHパラメータの作成
DHは鍵交換を安全に行うためのものでDHパラメータと呼ばれる。
これによりdh1024.pem
またはdh2048.pem
が生成される。
これらのファイルはOpenVPNサーバの/etc/openvpn/keys
に配置する。
クライアント証明書/クライアント秘密鍵の作成
OpenVPNクライアント用のクライアント証明書とクライアント秘密鍵を作成する。
引数にはホスト名orファイル名を指定する。なおクライアントが複数いる場合は引数を変更して作成する。
上記例の場合はサーバ証明書のclient.crt
とサーバ秘密鍵のclient.key
が生成される。
これらのファイルは安全にOpenVPNクライアントの/etc/openvpn/keys
に配置する。
ブリッジ接続を行う場合の起動スクリプトの設定
はじめにブリッジ接続のためのopenvpn-startup
とopenvpn-shutdown
を編集する。
次に/usr/share/doc/openvpn-2.3.1.4/sample/sample-scripts
以下ににあるbridge-start
、bridge-stop
をコピーしておく。
# /etc/openvpn/openvpn-startup
#!/bin/bash
/etc/openvpn/bridge-start
route add -net default gw 192.168.1.1
iptables -I FORWARD -i br0 -j ACCEPT
13.6.3. ブリッジ接続をする場合のOpenVPNサーバの設定
OpemVPMサーバの設定ファイルは/etc/openvpn/server.conf
となり、SampleファイルはCentOS7系では/usr/share/open-vpn/sample/sample-config-files
以下にある。
# ポート番号とプロトコル
port 1194
proto udp
# ルーティング接続なら「tun」、ブリッジ接続なら「tap0」
dev tap0
# 認証局証明書のファイル(絶対パス/設定ファイル起点の相対パス)
ca keys/ca.crt
# サーバの証明書ファイル
cert keys/server.crt
# サーバーの秘密鍵ファイル
key keys/server.key
# DHパラメータのファイル名
dh keys/dh2048.pem
# OpenVPNクライアントへ渡す情報
push " route 192.168.1.1 255.255.255.0"
# 実行ユーザ/グループ
user nobody
group nobody
# 接続中クライアントリスト出力ファイル
status /var/log/openvpn-status.log
# ログ出力するファイル(ない場合はsyslog)
log /var/log/openvpn.log
OpenVPNはUDPのポート1194を使用するのでOpenVPNサーバ側のネットワークでルータやファイヤーウォールで1194ポートを許可する設定が必要となる。 またIPパケットのフォワーディング設定も有効にする必要がある。
OpenVPNサービスの起動は以下の通り。
13.6.4. OpenVPNクライアントの設定
設定ファイルの主要内容は以下の通り。
# プロトコル
proto udp
# ルーティング接続なら「tun」、ブリッジ接続なら「tap0」
dev tap0
# Clientの指定
client
# 接続先サーバとポート番号
remote 112.56.23.112 1194
# 認証局証明書のファイル(絶対パス/設定ファイル起点の相対パス)
ca keys/ca.crt
# クライアントの証明書ファイル
cert keys/client.crt
# クライアントの秘密鍵ファイル
key keys/client.key
OpenVPNクライアントの起動例は以下の通り。