TCPラッパー (/etc/hosts.allow) によるアクセス制限
TCPラッパー(/etc/hosts.allow)によるアクセス制御は,libwrap をリンクしたサービスだけに有効である.OpenSSH はバージョン 6.7 で libwrap サポートを削除したため,Ubuntu 24.04 LTS の sshd では /etc/hosts.allow は効かない.SSH のアクセス制限には ufw または nftables,sshd_config を用いる.Ubuntu 24.04 LTS で libwrap を使うサービスの例は nfs-kernel-server(rpc.mountd)である.
TCPラッパーの基本
TCPラッパーによるアクセス制御は,サービスが libwrap ライブラリを介して接続を受け付ける場合に働く.制御ルールは /etc/hosts.allow と /etc/hosts.deny に書く.評価は次の順で行われ,最初に一致したルールで決まる.
-
/etc/hosts.allowに一致するルールがあればアクセスを許可する. -
/etc/hosts.denyに一致するルールがあればアクセスを拒否する. - どちらにも一致しなければアクセスを許可する.
基本的な書式は次の通りである.
サービスリスト : クライアントリスト [: オプション]
主なキーワードは次の通りである.
-
ALL: すべてのサービス,またはすべてのクライアントに一致する. -
ALLOW: アクセスを許可する. -
DENY: アクセスを拒否する. -
EXCEPT: 直前のリストから除外するリストを指定する.
サービスリストには,サービスのプロセス名(例: 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 パッケージの tcpdchk,tcpdmatch で行う.端末で次のコマンドを実行する.
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 をリンクしたサービスに対してのみ働く.
- 127.0.0.1,192.168.1.101,192.168.1.102,192.168.1.115 との通信はすべて許可する.
- 192.168.33.162 との通信は
rpc.mountdだけを許可する. - それ以外は拒否する.
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 をリンクしたサービスに対してのみ働く.
- 127.0.0.1 と 192.168.1.0/24 のネットワークにあるマシンとの通信はすべて許可する.
- 192.168.33.0/24 のネットワークにあるマシンとの通信は
rpc.mountdだけを許可する. - それ以外は拒否する.
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 の sshd は libwrap を使わないため,接続元の制限はファイアウォールまたは 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