TCPラッパー (/etc/hosts.allow) によるアクセス制限

TCPラッパー(/etc/hosts.allow)によるアクセス制御は,libwrap をリンクしたサービスだけに有効である.OpenSSH はバージョン 6.7 で libwrap サポートを削除したため,Ubuntu 24.04 LTS の sshd では /etc/hosts.allow は効かない.SSH のアクセス制限には ufw または nftablessshd_config を用いる.Ubuntu 24.04 LTS で libwrap を使うサービスの例は nfs-kernel-serverrpc.mountd)である.

TCPラッパーの基本

TCPラッパーによるアクセス制御は,サービスが libwrap ライブラリを介して接続を受け付ける場合に働く.制御ルールは /etc/hosts.allow/etc/hosts.deny に書く.評価は次の順で行われ,最初に一致したルールで決まる.

  1. /etc/hosts.allow に一致するルールがあればアクセスを許可する.
  2. /etc/hosts.deny に一致するルールがあればアクセスを拒否する.
  3. どちらにも一致しなければアクセスを許可する.

基本的な書式は次の通りである.
サービスリスト : クライアントリスト [: オプション]
主なキーワードは次の通りである.

サービスリストには,サービスのプロセス名(例: rpc.mountd)または ALL を指定する.クライアントリストには,IP アドレス,ホスト名,CIDR 表記のネットワークアドレス(例: 192.168.1.0/24),末尾にドットを付けたアドレスの前方一致(例: 192.168.1.),先頭にドットを付けたドメインの後方一致(例: .example.com),または ALL を指定する.TCPラッパーはホスト名や IP アドレスによる許可・拒否だけを行い,ポート単位の制御や接続状態の追跡(ステートフルパケットインスペクション)は行わない.

サービスがTCPラッパーの対象かどうかの確認

サービスの実行ファイルが libwrap をリンクしているかを ldd で確認する.出力に libwrap.so が現れなければ,そのサービスに対して /etc/hosts.allow の設定は効かない.端末で次のコマンドを実行する.

ldd /usr/sbin/sshd | grep libwrap
ldd /usr/sbin/rpc.mountd | grep libwrap

記述したルールの文法確認と,特定のサービス・クライアントの組み合わせに対する判定確認は tcpd パッケージの tcpdchktcpdmatch で行う.端末で次のコマンドを実行する.

sudo apt update
sudo apt -y install tcpd
sudo tcpdchk
tcpdmatch rpc.mountd 192.168.1.101

/etc/hosts.allowの設定例1(IP アドレス,サービス名によるアクセス制限)

/etc/hosts.allow を書き換える(/etc/hosts.deny は触らない).次の設定は,libwrap をリンクしたサービスに対してのみ働く.

ALL : 127.0.0.1 : ALLOW
ALL : 192.168.1.101 192.168.1.102 192.168.1.115 : ALLOW
rpc.mountd : 192.168.33.162 : ALLOW
ALL : ALL : DENY

/etc/hosts.allowの設定例2(ネットワーク範囲,サービス名によるアクセス制限)

/etc/hosts.allow を書き換える(/etc/hosts.deny は触らない).次の設定は,クライアントを CIDR 表記のネットワーク範囲で指定する例である.設定例1と同様に,libwrap をリンクしたサービスに対してのみ働く.

ALL : 127.0.0.1 : ALLOW
ALL : 192.168.1.0/24 : ALLOW
rpc.mountd : 192.168.33.0/24 : ALLOW
ALL : ALL : DENY

SSHのアクセス制限(ufw,sshd_config)

Ubuntu 24.04 LTS の sshdlibwrap を使わないため,接続元の制限はファイアウォールまたは sshd_config で行う.

ufw で 192.168.1.0/24 からの SSH(TCP 22番ポート)だけを許可する場合,端末で次のコマンドを実行する.

sudo ufw default deny incoming
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
sudo ufw enable
sudo ufw status verbose

sshd_config で接続元を制限する場合は,/etc/ssh/sshd_config.d/ に設定ファイル(例: /etc/ssh/sshd_config.d/99-access.conf)を作り,次のように記述する.user1 は許可するユーザ名に読み替える.

AllowUsers user1@192.168.1.0/24

設定ファイルを編集した後,端末で次のコマンドを実行し,文法を確認してから設定を反映する.

sudo sshd -t
sudo systemctl reload ssh