Memo

メモ > サーバ > 構築: 基本設定 > ファイヤーウォールを設定

■ファイヤーウォールを設定
※不要なアクセスを遮断する 諸々の初期設定を行っている最中に侵入される可能性があるので、早い段階で設定する ※新規の接続が対象で、確立済みの接続には影響しない ※AWSではセキュリティーグループを使用するので以下の手順は原則不要 ■概要 CentOS7では、iptablesではなくfirewalldコマンドで設定する 内部的にはiptablesが使われているが、共存はできない コマンドで操作してXMLに記録されるのが基本的な操作方法 典型的な設定のテンプレートとして「ゾーン」が用意されている publicはパブリックエリア用、internalは内部ネットワーク用、など 公開サーバならpublicを使用すればいい ループバックの指定、ESTABLISHED,RELATEDの指定、ICMPの指定といった、 基本的な機能は指定しなくても有効になっている 【丁寧解説】Linuxのファイアウォール firewalld の使い方 https://eng-entrance.com/linux-centos-firewall firewall-cmd ... コマンド。これに続けて様々な指定を行う --permanent ... 恒久的な設定を行う。反映には「firewall-cmd --reload」が必要。省略すると即時反映だが、再起動とともに消える --zone=public ... 操作対象のゾーン。省略すると、デフォルトのpublicゾーンが対象になる 以下にサービスやゾーンの初期設定の定義ファイルがある /usr/lib/firewalld/services /usr/lib/firewalld/zones 以下にユーザによってカスタマイズされた定義ファイルがある /etc/firewalld/services /etc/firewalld/zones 以下にダイレクトルールの定義ファイルがある /etc/firewalld/direct.xml 以下にfirewallの設定ファイルがある /etc/firewalld/firewalld.conf
# firewall-cmd --list-all … firewalldの設定内容を確認 public (active) … publicゾーンが設定されている target: default icmp-block-inversion: no interfaces: eth0 … eth0が対象になっている sources: services: ssh dhcpv6-client … SSH(22番ポート)のみ空いている ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: # firewall-cmd --direct --get-all-rules … ダイレクトルールを確認
CentOS7でのFirewalld設定(ほぼコマンド例) - Qiita https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280 CentOS 7 firewalld よく使うコマンド - Qiita https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e firewallは、ポートによる制限やIPアドレスによる制限など、手段が複数用意されている ポートによる制限: 特定のポートへのアクセスを許可する 例えば「firewall-cmd --permanent --add-port=10022/tcp」とすると、10022番ポートへのすべてのアクセスが許可される 例えば「firewall-cmd --permanent --add-port=8080/tcp」とすると、8080番ポートへのすべてのアクセスが許可される 基本的には、後述の「サービスによる制限」を利用する方が後から判別しやすい 設定された内容は、「firewall-cmd --list-all」で確認したとき「ports」に反映される サービスによる制限: サービス名を指定してアクセスを許可する 例えば「firewall-cmd --permanent --add-service=http」とすると、HTTPへのすべてのアクセスが許可される 例えば「firewall-cmd --permanent --add-service=https」とすると、HTTPSへのすべてのアクセスが許可される どのサービスがどのポートを使用するかは、 /usr/lib/firewalld/services/ssh.xml などのファイルに記録されている これを /etc/firewalld/services/ssh.xml などに複製してポート番号を変更することで、例えば「SSHのポートは22ではなく10022」のような制御ができる (詳細は、後述の「SSHのポート番号変更」も参照) 設定された内容は、「firewall-cmd --list-all」で確認したとき「services」に反映される IPアドレスによる制限: IPアドレスを指定してアクセスを許可する 例えば「firewall-cmd --permanent --add-source=203.0.113.1/32」とすると、203.0.113.1からのすべてのアクセスが許可される 設定された内容は、「firewall-cmd --list-all」で確認したとき「sources」に反映される リッチルールによる制限: 例えば「firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=ssh accept'」とすると、 SSH(デフォルトは22番ポート)へのアクセスを203.0.113.1からのアクセスに限定して許可される 設定された内容は、「firewall-cmd --list-all」で確認したとき「rich rules」に反映される SSHやFTPなどにIP制限を設けたい場合、原則このリッチルールでの指定となる 例えば「firewall-cmd --permanent --add-service=ftp」とした場合、 別途リッチルールによるIPアドレス別の許可を行なっても、FTPへのアクセスは全開放済みになっているので注意 いずれにせよ、設定を行ったら 「意図したアクセスを許可しているか」「意図しないアクセスが許可されていないか」 を都度確認するのが確実 ■起動
# firewall-cmd --list-all … firewallのコマンドを使用 FirewallD is not running … 起動していない # systemctl status firewalld … firewallの状態を確認 ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) … 起動していない Docs: man:firewalld(1) # systemctl start firewalld … ファイヤーウォールを起動(起動していない場合) # systemctl enable firewalld … ファイヤーウォールを自動起動(自動起動になっていない場合)
■設定方法 80番、443番、10022番ポートを開ける場合
# firewall-cmd --permanent --add-service=http # firewall-cmd --permanent --add-service=https # firewall-cmd --permanent --add-port=10022/tcp … 推奨されない方法かも。詳細は後述の「SSHのポート番号変更」を参照 # firewall-cmd --list-all … firewalldの設定内容を確認 public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: ssh dhcpv6-client http https … HTTPとHTTSのポートが空いた ports: 10022/tcp … 10022番ポートが空いた protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
設定をリセットする場合(一般的な方法かどうかは不明)
# cp /usr/lib/firewalld/zones/public.xml /etc/firewalld/zones/public.xml # firewall-cmd --reload
設定例
# firewall-cmd --permanent --add-service=http … 80番ポートへのアクセスを許可 # firewall-cmd --permanent --add-service=https … 443番ポートへのアクセスを許可 # firewall-cmd --permanent --add-port=22/tcp … 22番ポートへのアクセスを許可 # firewall-cmd --permanent --add-port=10022/tcp … 10022番ポートへのアクセスを許可 # firewall-cmd --permanent --add-source=203.0.113.1/32 … 203.0.113.1からのアクセスを許可 # firewall-cmd --permanent --add-source=203.0.113.0/24 … 203.0.113.0/24の範囲からのアクセスを許可 # firewall-cmd --permanent --set-log-denied all … アクセスを拒否したらログに記録 # firewall-cmd --permanent --remove-service=https … 443番ポートへのアクセス許可を削除する場合 # firewall-cmd --permanent --remove-port=10022/tcp … 10022番ポートへのアクセスを許可を削除する場合 # firewall-cmd --permanent --remove-source=203.0.113.1/32 … 203.0.113.1からのアクセスを許可 # firewall-cmd --permanent --add-service=ftp … 21番ポートへのアクセスを許可する場合 # firewall-cmd --permanent --add-port=60000-60030/tcp … 60000〜60030番ポートへのアクセスを許可する場合 # firewall-cmd --permanent --remove-port=60000-60030/tcp … 60000〜60030番ポートへのアクセス許可を削除する場合 # firewall-cmd --permanent --add-rich-rule='リッチルール' … より複雑なルール(リッチルール)を設定 # firewall-cmd --permanent --list-rich-rules … 設定されているリッチルールの確認(ルールの削除時などに使用できる) # firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept' # firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept' … 特定IPから特定サービスへのアクセスを許可&削除例 # firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept' # firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept' … 特定IPから特定ポートへのアクセスを許可&削除例
リッチルールの削除は、「firewall-cmd --permanent --list-rich-rules」で設定されているルールを確認し、削除したいルールをコピーして 「firewall-dmc --permanent --remove-rich-rule='(ここにコピーしたものを貼り付け)'」 とすることで削除できる CentOS7でのFirewalld設定(ほぼコマンド例) - Qiita https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280
# firewall-cmd --reload … firewalldの設定を再読込 # systemctl restart firewalld … firewalldを再起動 # firewall-cmd --list-all-zones … firewalldの設定内容を確認(すべてのゾーン) # firewall-cmd --list-all … firewalldの設定内容を確認(デフォルトゾーン) # firewall-cmd --list-all --zone=public … firewalldの設定内容を確認(特定のゾーン / この場合は「public」ゾーン) # firewall-cmd --get-default-zone … デフォルトで使用されるゾーン # firewall-cmd --set-default-zone=block … デフォルトで使用されるゾーンを変更する場合 # firewall-cmd --get-active-zones … アクティブになっているゾーン(何も返されなければ、デフォルトの「public」が割り当てられている) # firewall-cmd --get-services … 設定時に使用できるサービス一覧 # ll /usr/lib/firewalld/services … 直接確認する場合 # firewall-cmd --state … 動作状況を確認
CentOS7でfirewalld(ファイアウォール)の設定。firewall-cmd -list-allでports(ポート番号)の指定をお忘れなく! - エコテキブログ https://e-yota.com/webservice/post-2563/
# iptables-save … すべての設定内容を確認
CentOS7のfirewalldをまじめに使うはじめの一歩(systemdも少し) - Qiita https://qiita.com/shrkw/items/8410e9cb65eb789a40e1 firewalld初心者のメモ - Qiita https://qiita.com/T_Shinaji/items/b3ba400feb3c6adebd27 CentOS7でのFirewalld設定(ほぼコマンド例) - Qiita https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280 CentOS 7 firewalld よく使うコマンド - Qiita https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e CentOS7 ダイレクトルールを使ったFirewallの強化(iptables) http://www.yam-web.net/centos7/direct-rule/index.html firewalldでソースを指定して通信を遮断する方法 | server-memo.net http://www.server-memo.net/centos-settings/firewalld/source-drop.html 自分なりにあちこちからかき集めて作ったセキュアなCentOS7サーバ - Qiita https://qiita.com/KurokoSin/items/51e79657f1f2104cf607 firewall-cmdコマンドの使い方 - Qiita https://qiita.com/hana_shin/items/bd9ba363ba06882e1fab ■SSHのポート番号変更 SSHのポートを変更している場合、 「--add-port=10022/tcp」と指定する…よりも、以下のようにサービスのポート番号を変える方が良さそう
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml # vi /etc/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/> … SSHのポート番号に合わせて変更 </service>
CentOS7でSSHのポート番号を変更する - Qiita https://qiita.com/fk_2000/items/019b62818e34be973227 ■設定例 以下に設定すべき内容の一例をまとめ中
# systemctl start firewalld … ファイヤーウォールを起動(起動していない場合) # systemctl enable firewalld … ファイヤーウォールを自動起動(自動起動になっていない場合) # cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml # vi /etc/firewalld/services/ssh.xml … 必要に応じて、SSHのポート番号を変更する # firewall-cmd --list-all … firewalldの設定内容を確認 # firewall-cmd --get-default-zone … デフォルトで使用されるゾーンを確認(必要に応じて) # firewall-cmd --set-default-zone=public … デフォルトで使用されるゾーンを変更(必要に応じて) # firewall-cmd --permanent --remove-service=ssh … 通常のSSHポートを塞ぐ(特定IPからの接続のみ許可する場合) # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 10.0.0.0/8 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 172.16.0.0/12 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 192.168.0.0/16 -j DROP … プライベートアドレスを拒否 # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 127.0.0.0/8 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 169.254.0.0/12 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 192.0.2.0/24 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 198.51.100.0/24 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 203.0.113.0/24 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 224.0.0.0/4 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 240.0.0.0/5 -j DROP … ローカルアドレスや例示用アドレスなどを拒否 # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 0.0.0.0/8 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 255.255.255.255 -j DROP … デフォルトルートとブロードキャストアドレスを拒否 # firewall-cmd --permanent --direct --add-chain ipv4 filter LOG_PINGDEATH # firewall-cmd --permanent --direct --add-rule ipv4 filter LOG_PINGDEATH 0 -m limit --limit 1/sec --limit-burst 4 -j ACCEPT # firewall-cmd --permanent --direct --add-rule ipv4 filter LOG_PINGDEATH 0 -j LOG --log-prefix "[FIREWALL PINGDEATH]: " # firewall-cmd --permanent --direct --add-rule ipv4 filter LOG_PINGDEATH 0 -j DROP … Ping of Death 攻撃対策(1秒間に4回を超えるpingはログを記録して破棄) # firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=ssh accept' … 特定IPからSSHへのアクセスを許可(必要に応じて) # firewall-cmd --permanent --add-service=http … HTTPへのアクセスを許可 # firewall-cmd --permanent --add-service=https … HTTPSへのアクセスを許可 # firewall-cmd --set-log-denied all … アクセスを拒否したらログに記録 # firewall-cmd --reload … firewalldの設定を再読込
※22番ポートが閉じられているかは要確認 ■CentOS6の場合 さくらのVPS を使いはじめる 3 - iptables を設定する http://akabeko.me/blog/2010/09/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps-%E3%82%92%E4%BD%BF%E3%81%84%E... iptablesの設定 http://www.nina.jp/server/redhat/iptables/iptables.html ファイアウォール構築(iptables) http://centossrv.com/iptables.shtml 【丁寧解説】Linuxファイアウォール iptablesの使い方 https://eng-entrance.com/linux-firewall
# yum list installed | grep iptables … iptablesがインストールされていることを確認 iptables.x86_64 1.3.5-5.3.el5_4.1 installed … インストールされている iptables-ipv6.x86_64 1.3.5-5.3.el5_4.1 installed # iptables -L … iptablesの設定を確認 Chain INPUT (policy ACCEPT) … 何も設定されていない target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
以下、ファイヤーウォールを設定
# vi /etc/sysconfig/iptables … ファイヤーウォールを設定
############################## #テーブル ############################## #パケットフィルタリングではfilterテーブルを使用 *filter ############################## #デフォルトポリシー ############################## #受信はすべて破棄 :INPUT DROP [0:0] #経由はすべて破棄 :FORWARD DROP [0:0] #送信はすべて許可 :OUTPUT ACCEPT [0:0] #Ping of Death 攻撃対策 :LOG_PINGDEATH - [0:0] #プライベートアドレスを拒否 -A INPUT -s 10.0.0.0/8 -j DROP -A INPUT -s 172.16.0.0/12 -j DROP -A INPUT -s 192.168.0.0/16 -j DROP #ローカルアドレスや例示用アドレスなどを拒否 -A INPUT -s 127.0.0.0/8 -j DROP -A INPUT -s 169.254.0.0/12 -j DROP -A INPUT -s 192.0.2.0/24 -j DROP -A INPUT -s 198.51.100.0/24 -j DROP -A INPUT -s 203.0.113.0/24 -j DROP -A INPUT -s 224.0.0.0/4 -j DROP -A INPUT -s 240.0.0.0/5 -j DROP #デフォルトルートとブロードキャストアドレスを拒否 -A INPUT -d 0.0.0.0/8 -j DROP -A INPUT -d 255.255.255.255 -j DROP #Ping of Death 攻撃対策(1秒間に4回を超えるpingはログを記録して破棄) -A LOG_PINGDEATH -m limit --limit 1/sec --limit-burst 4 -j ACCEPT -A LOG_PINGDEATH -j LOG --log-prefix "[IPTABLES PINGDEATH]: " -A LOG_PINGDEATH -j DROP ############################## #ユーザ定義ポリシー ############################## #ユーザ定義チェーン :MY-FIREWALL - [0:0] #よく見かける RH-Firewall-1-INPUT という名前である必要はない #受信と経由は「MY-FIREWALL」の設定に従う -A INPUT -j MY-FIREWALL -A FORWARD -j MY-FIREWALL #インタフェースが lo(ループバック / 自分自身に対してのデータ送信)なら通信を許可 -A MY-FIREWALL -i lo -j ACCEPT #通信確立の応答(ESTABLISHED)や、確立済みの通信に関する通信(RELATED)を許可 -A MY-FIREWALL -m state --state ESTABLISHED,RELATED -j ACCEPT #プロトコルが icmp(ICMP / 互いの状態を確認)なら通信を許可 -A MY-FIREWALL -p icmp --icmp-type any -j ACCEPT #プロトコル番号が 50(ESP / パケットが改ざんされていないか認証を行う。パケットの暗号化を行う)なら通信を許可 -A MY-FIREWALL -p 50 -j ACCEPT #プロトコル番号が 51(AH / パケットが改ざんされていないか認証を行う。パケットの暗号化はできない)なら通信を許可 -A MY-FIREWALL -p 51 -j ACCEPT #プロトコルが udp かつ送信先ポートが 5353(Multicast DNS / 数字のアドレスを名前に変換)かつ送信先アドレスが 224.0.0.251 なら通信を許可 -A MY-FIREWALL -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT #プロトコルが udp かつ送信先ポートが 631(Internet Printing Protocol / 印刷データのやりとりを行う)なら通信を許可 #-A MY-FIREWALL -p udp -m udp --dport 631 -j ACCEPT #印刷を使う場合に有効化する #プロトコルが tcp かつ送信先ポートが 631(Internet Printing Protocol / 印刷データのやりとりを行う)なら通信を許可 #-A MY-FIREWALL -p tcp -m tcp --dport 631 -j ACCEPT #印刷を使う場合に有効化する #SSHを許可(IP制限あり) -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 22 -s 203.0.113.0 -j ACCEPT -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 10022 -s 203.0.113.0 -j ACCEPT #以上のチェックにかからなかったパケットを /var/log/messages に記録。ただし記録は1秒間に1回まで -A MY-FIREWALL -j LOG --log-level info --log-prefix "[IPTABLES REJECT]: " -m limit --limit 1/s #以上のチェックにかからなかったパケットは、ICMPパケット host-prohibited を返して接続を拒否 -A MY-FIREWALL -j REJECT --reject-with icmp-host-prohibited ############################## #以上の内容を登録 ############################## COMMIT
# service iptables restart … ファイヤーウォールを再起動
※ループバックの指定 ... 同じコンピュータ上で動作するプログラム同士が、通信し合うときに使う仮想的なインターフェース ※ESTABLISHED,RELATEDの指定 ... サービスの種類によっては開放してあるポートは最初の受付だけに使い、 その後のやりとりは通信相手ごとにランダムなポートが使われる場合がある この場合、何番のポートを開放すればいいか事前に決められない ※ICMPの指定 ... 通信経路確認用の traceroute コマンドや、疎通確認用の ping コマンドを使うために必要なもの ※fail2banを導入している場合、続けて以下を実行しないとfail2banの設定が消えたままになるみたい? ファイヤーウォールを再起動する場合は注意する
# service fail2ban restart

Advertisement