
・CentOS 8 でドメインでアクセス制御を行いたい
・CentOS 8 でhosts.allow、hosts.denyが動かないのはなぜ?
・whitelist/ホワイトリストとblacklist/ブラックリストとは?
・Squidでのwhitelistの設定方法を知りたい
こういった疑問に答えます。
CentOS 8 でwhitelistで特定のドメインだけアクセスさせたい。設定方法を徹底解説
先日、CentOS 8 を利用している環境で、他のサーバやFirewallなどを利用せずに特定のドメインだけアクセスさせたいという要件ができました。
調べてみると、CentOS 8 では『TCPWrapper』が廃止されており、hosts.allowやhosts.denyの利用が出来ないためドメインのアクセス制御が出来ません。
また、iptablesやfirewalldもIPアドレスでの制御は可能なのものドメインでの制御はできません。
そこで今回は、CentOS 8 の環境でwhitelist(ホワイトリスト)を利用したドメインアクセスの制御を行ってみたいと思います。
whitelist/ホワイトリストとblacklist/ブラックリストとは?
whitelist/ホワイトリストは通信やセキュリティの分野で多く利用される用語(機能)です。
whitelist/ホワイトリストとは、通信やアプリケーションの使用を許可することでその通信やアプリケーションの利用ができるようになります。
一方で、blacklist/ブラックリストは通信やアプリケーションの使用を拒否することで、指定する通信やアプリケーションの使用が不可となります。
全体の通信やアプリケーションのうち、一部のみを利用させたい場合にはwhitelist/ホワイトリストで制御すると楽なのに対し、全体の通信やアプリケーションは基本は利用可という環境で、一部の通信やアプリケーションのみを拒否したい環境ではblacklist/ブラックリストでの制御が楽になります。
今回は、通信の制限なのでSquidで、且つ、一部の通信だけ許可したいためWhitelistでの制御を行います。
ドメインでのwhitelist制御を行うならSquidが簡単
以前こちらでご紹介していますが、Squidを利用することでProxyサーバーを簡単に構築することが出来ます。
しかもProxyサーバーには、ドメインによるwhitelistが標準機能が搭載されているため、今回はこのSquidをローカルにインストールし、ロカール経由の通信をSquid経由でドメイン制御を行うことで問題解決としました。
準備したのは以下の環境です。
- CentOS Linux release 8.3.2011
- Squid Cache: Version 4.15
- 端末のIPアドレスは192.168.1.29(適宜変更ください)
また毎度ですが、自宅サーバー環境で構築を行っていますので、自宅サーバーをお持ちでない方はこの機会にどうぞ。
Squidのインストールと各種設定
こちのらブログでご紹介していますが、CentOS 8 は昨年末でAppStreamの配信が完了しているので標準ではyumの設定が出来ません。
CentOS 8 でyumを利用するにはこちらを参考にしてください。
CentOSのインストールとyumの利用が可能になった後には、以下の設定を行っていきます。
- Squidのインストールと設定
- whitelistの設定
- Clientの通信をProxy経由にする設定
- Squidのサービス再起動
- ブラウザの設定
Squidのインストールと設定
Squidのインストールはyumが使えてしまえばとても簡単です。
# yum -y install squid
Squidのインストールが完了したら設定を行いますが、設定ファイルの編集前に必ずバックアップを取っておきましょう。
# cp -p /etc/squid/squid.conf /etc/squid/squid.conf.bk
Squidのインストール後に設定ファイル『/etc/squid/squid.conf』内の以下を設定追加します。
設定内容 | パラメータ |
whitelistの設定を追加 | acl whitelist dstdomain “/etc/squid/whitelist” http_access allow whitelist |
コメントアウト | #http_access allow localnet #http_access allow localhost |
ポート番号の変更 | http_port 8080 |
プロキシサーバーの匿名性設定関連 | no_cache deny all forwarded_for off request_header_access X-Forwarded-For deny all request_header_access Via deny all request_header_access Cache-Control deny all |
実際の設定例はこちらです。
# cat /etc/squid/squid.conf
#
# Recommended minimum configuration:
#
# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN)
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports
# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports
# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager
# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
acl whitelist dstdomain "/etc/squid/whitelist" #Whitelist 用の設定を追加
http_access allow whitelist #Whitelist 用の設定を追加
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow whitelist #コメントアウト
#http_access allow localhost #コメントアウト
# And finally deny all other access to this proxy
http_access deny all
# Squid normally listens to port 3128
http_port 8080 #ポート番号を8080に変更
# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256
# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid
#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
no_cache deny all #キャッシュOFF設定
forwarded_for off #プロキシサーバーの匿名性設定関連
request_header_access X-Forwarded-For deny all #プロキシサーバーの匿名性設定関連
request_header_access Via deny all #プロキシサーバーの匿名性設定関連
request_header_access Cache-Control deny all #プロキシサーバーの匿名性設定関連
変更が必要な設定を設定ファイルに反映して設定は完了です。
設定作業に当たってエディターの使い方が分からない方はこちらを参考にどうぞ。
whitelistの設定
次に通信を許可するwhitelistの設定は『/etc/squid/whitelist』に追加します。
# vi /etc/squid/whitelist
.yahoo.co.jp
.centos.org
whitelistを設定することで、設定したドメイン以外へのアクセスを拒絶することが出来ます。
上記の例でいうと、サブドメインを含む『yahoo.co.jp』と『.centos.org』以外のサイトへのアクセスが禁止されます。
Clientの通信をProxy経由にする設定
『cat /etc/environment』にProxyサーバーの設定情報を追加することで、常に通信をProxyに向けさせることが出来ます。
# vi /etc/environment
http_proxy="http://192.168.1.29:8080/"
HTTP_PROXY="http://192.168.1.29:8080/"
https_proxy="https://192.168.1.29:8080/"
HTTPS_PROXY="https://192.168.1.29:8080/"
ftp_proxy="ftp://192.168.1.29:8080/"
FTP_PROXY="ftp://192.168.1.29:8080/"
プログラムによって小文字もしくは逆に大文字の設定しか受け付けないプログラムが存在するため、大文字小文字の二つの設定をします。
また今回は使用しませんが、最終行にno_proxy 設定としてドメイン名あるいはホスト名をカンマ区切りで明記すると、それらのサーバーに接続の際にはプロキシサーバーを使用しないようにすることが出来ます。
no_proxy=".example.co.jp,.test.local,server1.example.com,server2.example.com"
以上でwhitelistの設定は完了です。
Squidのサービス再起動
設定が完了したらSquidのサービスの再起動を行います。
# systemctl restart squid.service
# systemctl status squid.service
● squid.service - Squid caching proxy
Loaded: loaded (/usr/lib/systemd/system/squid.service; enabled; vendor prese>
Active: active (running) (thawing) since Sun 2022-04-03 15:58:10 JST; 7h ago
Docs: man:squid(8)
Process: 2009 ExecReload=/usr/bin/kill -HUP $MAINPID (code=exited, status=0/S>
Process: 9296 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, sta>
Main PID: 9302 (squid)
Tasks: 3 (limit: 11245)
Memory: 17.8M
CGroup: /system.slice/squid.service
tq9302 /usr/sbin/squid --foreground -f /etc/squid/squid.conf
tq9306 (squid-1) --kid squid-1 --foreground -f /etc/squid/squid.conf
mq9307 (logfile-daemon) /var/log/squid/access.log
再起動後は『systemctl status squid.service』コマンドで、サービスが正しく起動しているか確認しましょう。
端末のProxyの設定
端末側の通信をProxy経由にするための設定を行います。
ログイン後、『アクセスビリティ』、『設定(se)』を入力し『設定』のアイコンを選択します。

設定メニューが表示されたら『ネットワーク』選び、ネットワークプロキシの『歯車』をクリックします。

すると『ネットワークプロキシ』の設定画面が表示されるので、HTTPプロキシにループバックアドレスとポート番号8080を設定します。

以上で設定は完了です。
設定完了後のテスト
テスト用の設定としてyahoo.co.jpをwhitelistに追加していますので、yahoo.co.jpとそれ以外のサイトにアクセスした際の違いを見てみます。
【yahoo.co.jp】

yahoo.co.jpのポータルサイトを構成するにあたって様々なドメインにアクセスしますので、yahoo.co.jpのみのドメイン許可では本来のサイトの画面は表示されません。
ただしyahoo.co.jpのサイトにアクセスが可能な事は理解できます。
【facebook.co.jp】
facebook.co.jpはwhitelistに登録していないため接続することはできません。

期待通りに動作していることが分かります。
まとめ
CentOS 7 以前ではhosts.allowやhosts.denyを利用して特定ドメインのアクセス許可・拒否が簡単にできましたが、CentOS 8 ではTCPWrapperが廃止されているいるため同様の設定が簡単に行えません。
利用用途としては、ユーザーに利用できるドメインを絞った環境を端末1台で構築する場合に、手軽構成できるためとても便利ですね。
今回は、Squidを利用したwhitelistを利用した端末でのドメインアクセスへの制御方法について解説しました。
なお、本ブログではITエンジニア向けの小技をご紹介していますので、参考にしてみてください。
