コンテンツにスキップ

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コマンドで行う。

iptables-restore < iptables.backup

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=yesnet.ipv4.ip_forward=1など記述する必要がある。

13.2.2. IPマスカレード

IPマスカレードはLAN側ホストがインターネットを利用する際にIPアドレスをグローバルアドレスに変換したり、その逆を行う機能のこと。 IPマスカレード設定をLinuxで行う場合はiptablesで以下のように設定する。

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

設定例は以下の通り。

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT 10.1.2.3

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コマンドグループを記述できる。

<Limit FTPコマンド/FTPコマンドグループ>~</Limit>
アクセス制御ディレクティブ 説明
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ユーザやシステムアカウントを記述すると良い

root
bin
daemon
mail
:
:

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サーバを動作させることで回避できる。 パッシブモードではデータ転送の際にクライアント側からサーバへ接続要求することができる。

各サーバにおけるパッシブモードの設定方法は以下の通り。

# proftpd.confの場合

# ルータのWAN側IPアドレス
MasqueradeAddress 10.2.3.4

# 利用するポート設定
PassivePorts 52000 52020
# vsftpdの場合

pasv_enable=YES
# Pure-FTPDノヴァ愛

PassivePortRange 30000 50000

13.2.6. 匿名FTPサーバ

匿名FTPサーバ(Annonymous FTP)は匿名でFTPサーバを利用できるようにすること。 この場合chrootにより権限のないディレクトリにアクセスできないようにすることが重要となる。

方法としては以下の通り。

  1. /home/ftpなどのディレクトリを作成する
  2. /bin,/lib,/etcなどを作成しFTPサービス運営に必要なファイルをコピーする
  3. anonnymousユーザ用のディレクトリ(/home/ftp/pub)などを作成する
  4. /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に格納される。 検証するときにフィンガープリントをクライアント側に登録しておけばサーバに正当性があるかどうか検証できる。 サーバ側の鍵でフィンガープリントは以下のように確認できる。

ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub

2回目以降の接続は接続先から送られたホスト鍵をKnown_hosts内の鍵と比較し問題がないとユーザ認証に進むこととなる。 そのためこの段階で接続先が悪意あるものによりなりすましされていたら警告が出るようになる。

13.4.3. 公開鍵認証

SSHではホスト認証後にユーザ認証に進む。 ユーザ認証では公開鍵認証が試行される。 公開鍵認証の手順は以下の通り。

  1. サーバ側に公開鍵を登録する
  2. SSH接続時に公開鍵が利用できるか確認が行われる
  3. クライアント側は公開鍵にユーザ名などの情報を加え、秘密鍵で署名しサーバに送信する
  4. サーバはユーザの公開鍵を使用して署名を確認する
  5. 確認できるとログインを許可する

公開鍵

なおユーザの公開鍵と秘密鍵ペアの生成にはssh-keygenコマンドを使用する。

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ファイルは所有者のみ読み書きできるようにしておく。

chmod 600 ~/.ssh/authorized_keys

13.4.4. ssh-agent

ssh-agentは秘密鍵使用時に尋ねられるパスフレーズの入力の手間を省く機能のこと。 ssh-agentはクライアント側で稼働するデーモンで、秘密鍵をメモリ上に保持しておき、必要時にそれを利用する仕組みとなっている。 そのため毎度パスフレーズを打つ必要がない。

ssh-agentの利用にはssh-agentの子プロセスにbashを起動し、ssh-addコマンドで秘密鍵を登録する。

ssh-agent bash
ssh-add

この設定以降、このbashや子プロセスではパスフレーズの入力が不要となる。 ssh-agentが保持している秘密鍵の一覧はssh-add -lコマンドで確認できる。

13.4.5. SSHポート転送

SSHポート転送(SSHポートフォワーディング)はあるポートに送られてきたTCPパケットをSSHを使用した安全経路でリモートホストの任意ポートに転送すること。 この機能によりPOP、FTPなどの暗号化されていないプロトコルを使った通信の安全性を高めることができる。

SSHポート転送

ポート転送を行う場合のssh書式は以下の通り。

ssh -L [ローカルポート]:[リモートホスト]:[リモートポート] [リモートホストユーザ名]@[リモートホスト]

13.4.6. SSHサーバのセキュリティ

SSHサーバをデフォルト設定ではなく、適切に設定するとよりセキュアな運用ができる。 項目は以下の通り。

  • SSH Version1.0の禁止
  • パスワード認証の禁止
  • rootログインの禁止
  • 接続元制限

SSH Version1.0の禁止

SSHバージョン2.0のみを許可することで、SSHバージョン1.0の脆弱性を防ぐことができる。 sshd_configProtocol 2にすることで可能。

パスワード認証の禁止

パスワード認証は原則は無効にした方がよい。 これはブルートフォースアタックやパスワードが知られる危険性があるためである。

同様にsshd_configPasswordAuthentication noと記述する。

rootログインの禁止

rootユーザのリモートログインも基本は許可すべきではない。 sshd_configPermitRootLogin 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という機能が利用されている必要があるので確認は以下コマンドで可能。

ldd `which sshd` | grep 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はポートスキャンツールで、開いているポートから稼働しているサービスを特定できる。

nmap <スキャンタイプ> <オプション> <IPアドレス \| ドメイン>
オプション 説明
-sT 接続スキャン
-sS SYNスキャン(TCP接続のSYNパケットを送信し、SYN+ACKが帰るかどうかでポートスキャンを行う)
-sN Nullスキャン
-sF FINスキャン
-sX Xmasスキャン
-sR RFCスキャン
-O OSを調べる

XmasツリースキャンというTCPヘッダのFIN、URQ、PSHフラグを有効にしたパケットを送って藩のを確かめる手法も利用できる。

nmap -sX www.example.com

netstat/ss/lsof/fuserコマンド

netstat,ss,,lsof,fuserコマンドも同様に開いているポートを確認できる。

netstat -atun

ss -atun

lsof -f -n

fuser -v -n tcp 22

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に以下のように記述する。

sshd: LOCAL

またspawnを使い特定のコマンドを実行させることもできる。

ALL:ALL:spawn logger -t hosts.deny Connectiondenied from %c

13.5.4. セキュリティ情報

セキュリティの情報源には以下のようなものがある。

CERT/CC

セキュリティ事故情報を収集しセキュリティに関する技術支援情報を発信しているサイト。

BUGTRAQ

BUGTRUGはバグ情報を公開するためのメーリングリスト。

CIAC

CIACは米エネルギー省が運営するサイトで、セキュリティインシデントの報告を行っている。

13.5.5. インシデントへの対処

サーバがクラックされると以下のことが行われる可能性がある。

  • コマンドの改ざん
  • ログ改ざんやsyslog停止
  • 悪意のあるソフトウェアのインストールと使用

改ざんされたlsコマンドでは不正なファイルのみを表示しないようにしてある場合があり、この場合はecho *コマンドによりlsを代用できる。 またファイル改ざんのチェックはrpmコマンドにより確認できる。

rpm -Va

このオプションはイストール時のファイルの状態と現状を比較し、差があればプロパティと一緒に表示する。 表示される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を編集してパラメータを書き換える。

export KEY_cOUNTRY = "JP"
export KEY_PROVINCE = "TOKYO"
:
:

設定したファイルを読み込み不要なファイルは削除する。

cd /etc/openvpn
source vars
./clean-all

CA証明書/CA秘密鍵の作成

認証用のCA証明書とCA秘密鍵を作成する。

./build-ca

上記コマンドでCA証明書ファイルca.crtとCA秘密鍵ファイルca.keyが作成される。 これらのファイルは/etc/openvpn/keysに配置する。 またCA証明書ca.crtはOpenVPNサーバ/クライアントの/etc/opnvpn/keysにも配置する。

サーバ証明書/サーバ秘密鍵の作成

OpenVPNサーバ用のサーバ証明書と秘密鍵を作成する。

./build-key-server server

引数にはホスト名orファイル名を指定する。 上記例の場合はサーバ証明書のserver.crtとサーバ秘密鍵のserver.keyが生成される。 これらのファイルはOpenVPNサーバの/etc/openvpn/keysに配置する。

DHパラメータの作成

DHは鍵交換を安全に行うためのものでDHパラメータと呼ばれる。

./build-dh

これによりdh1024.pemまたはdh2048.pemが生成される。 これらのファイルはOpenVPNサーバの/etc/openvpn/keysに配置する。

クライアント証明書/クライアント秘密鍵の作成

OpenVPNクライアント用のクライアント証明書とクライアント秘密鍵を作成する。

./build-client client

引数にはホスト名orファイル名を指定する。なおクライアントが複数いる場合は引数を変更して作成する。 上記例の場合はサーバ証明書のclient.crtとサーバ秘密鍵のclient.keyが生成される。 これらのファイルは安全にOpenVPNクライアントの/etc/openvpn/keysに配置する。

ブリッジ接続を行う場合の起動スクリプトの設定

はじめにブリッジ接続のためのopenvpn-startupopenvpn-shutdownを編集する。 次に/usr/share/doc/openvpn-2.3.1.4/sample/sample-scripts以下ににあるbridge-startbridge-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
# /etc/openvpn/bridge-stop

#!/bin/bash
/etc/openvpn/bridge-stop

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パケットのフォワーディング設定も有効にする必要がある。

echo 1 > /proc/sys/net/ipv4/ip_forward

OpenVPNサービスの起動は以下の通り。

systemctl start openvpn-bridge

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クライアントの起動例は以下の通り。

/usr/sbin/opnevpn /etc/openvpn/client.conf