CentOS7:firewalldでアクセス制御を行う

CentOS
この記事は約12分で読めます。
スポンサーリンク
スポンサーリンク

CentOS7では、ポートのアクセス制御をfirewalld で行います。この記事ではfirewalldの設定方法を紹介します。

CentOS6で使われていたiptablesから変更になっているので、戸惑うかもしれませんが、慣れると便利ですよ。

スポンサーリンク
スポンサーリンク

ポート制限でセキュリティを高めましょう

記事「windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その4)手作業でLAMP環境構築」では、仮想マシン上にCentOS7を使ってLAMP環境を構築していますが、firewalldは起動されていないままになってます。

仮想環境ではfirewalldまで使用する必要はないと思うからですが、外部のサーバーを使う場合には、セキュリティを高めるために必要です。

不要なポートを閉じたり、SSHのポートは、特定のIPアドレスからだけアクセスできるようにしたりと、なるべく、外部に公開する部分を必要最小限にすることが、セキュリティを高めるコツです。

では、説明しますね。

firewalldによるポートアクセス制御

firewalld が起動されているか確認

systemctrl status で確認できます。

「disabled」は、OS起動時の自動起動がOFFということ、「Active: inactive」は起動していないという意味です。

 

firewall-cmd というfirewalldを操作するコマンドを実行してみても、firewalldが起動しているかを確認できます。

 

firewalld をスタートするには

他のサービスと同じで systemctl start  を使います。

実行後のステータスを見ると、「Active: active(running)」になってます。

自動起動もONにしましょう。

systemctl enable を使います。

statusを見ると、「Loaded: loaded ・・・; enabled;」と、自動起動ONになりましたね。

firewalldの状態を確認

起動状態は確認できました。

では、現在のポートの状況を確認してみましょう。

firewalldの操作には、 firewall-cmd  コマンドを使います。

firewall-cmd list-all  で現在の状況が表示されます。

例として、下リストに、vagrant でbento/centos-7.5 のboxをインストールした後の仮想マシンで実行したリストを載せます。

この環境では、デフォルト(素の状態)では、public ゾーンがアクティブになってます。

で、NICはeth0、eth1あって、ポートがオープンになっているのは、sshとdhcpv6-client だけになってます。

ここに、httpのポートをオープンしたりしていきましょう。

仮想マシンなので、このままで全然よいのですが、固定IPアドレスを使っているか、IPv4を使っている場合は、dhcpv6-client を開けておく必要はありませんね。また、SSHは、指定したIPアドレスからだけアクセスできるように変更するなどした方がよいですね。

 

ゾーンとは

firewalldにはゾーンという概念があります。

ゾーンごとに別々のポートやIPアドレスのアクセス制御を設定することができて、使っているゾーンを変更すれば、アクセス制御を一気に切り替えることができるんです。

また、NICごとにゾーンを指定できるので、内部用とか外部用でNICを分けて管理するのに便利です。

最初はデフォルトゾーンとして public というゾーンが選択されているので、それをベースに変更させていけば良いと思います。

※firewalldに最初からあるゾーンは、publicを合わせて9種類あります。

firewall-cmd --list-all-zones オプションでそれぞれの設定を表示できます。確認してみましょう。dropとかblock はポートを遮断してますね。

blockの場合は、内部からアクセスしたときの返答の通信は許可されます。dropはそれすらできないため、クライアントとしても外部にアクセスして結果を得ることができなくなります。

また、trustedゾーンでは、target: ACCEPTになってますが、ルールがなくてもすべてのポートが許可になってます。サーバーとしては要注意ですね。

 

設定変更手順

サービス追加

サービス追加すると、そのサービスの規定ポート(これをWell Known Portと言います)のアクセスを許可することができます。

上リストのようにデフォルトではserviceとして、ssh と dhcp しか開いてないです。

ウェブサーバーとするために、httpとhttpsをオープンしておきましょう。

サービス追加するには、 firewall-cmd--add-service オプションを指定して実行します。
しくじったとき、先起動できるように、一時的な変更がデフォルトになるため、再起動しても変更したままにするために --permanent オプションも指定しておきます。

 

追加したら、有効にするために、 --reload オプションを指定して firewall-cmd  を実行します。

実行後は以下のように http、https がサービスに追加されています。

この状態で、外部からブラウザでウェブページにアクセスできます。

サービス削除

サービスの削除するには、 --remove-service オプションを指定します。

※注意:ssh を削除すると、当然ですが ssh でログインできなくなります。(ただし、その時点でログインしているものはログインしたままになります)。

※この例では、sshを削除した後、指定したIPアドレスからだけsshアクセス(ポート番号22)からアクセスできるように設定しています。sshサービスを削除するときには、直接端末へアクセスできるのでなければ、同時にIPアドレス限定でのsshポートの開放をしましょう。

では、まず、サービスの削除です。

下では、 --permanent でさっきと同様に恒久指定してるほかに、 --zone でpublic を指定しています。が、現在 public ゾーンが有効なので、この指定はなくてもOKです。

設定を有効にするには、 --reload オプションの実行が必要ですが、その前に、IPアドレス指定でsshのポート開放をしておきます。(仮想マシンだとssh以外でアクセスできないためリスク回避のため)。

アクセス元を指定してポートの開放(rich-rule使用)

指定したIPアドレスからだけポートを開放したい場合は、 --add-rich-rule オプションを指定します。長いですが、間違えないように指定しましょう。

下の例では、仮想マシンに対して、ホストマシンが192.168.33.1 となってるので、このアドレスからのアクセスのみSSHのポート22を開放してます。

 

有効にするために、 --reloadオプションを実行します。

--list-all で確認してみましょう。services からはsshがなくなり、その代わり、rich rulesに、ポート22へのアクセスがaccept(許可)されていることが分かります。

※ssh の設定を変更している場合、現在SSHログインしている端末はそのままにして、別に端末ウィンドウを起動して、SSHログインできるか確認してください。

最悪、設定を間違えていると、サーバーへアクセスできなくなります。

アクセステスト

では、別の端末ウィンドウからアクセスしてみます。

許可されたIPアドレスからのアクセス

まず、ipアドレス192.168.33.1のホストOSからのアクセスです。sshで192.168.33.10にログインできました!

 

禁止されたIPアドレスからのアクセス

禁止する前は、下リストのようにIPアドレス192.168.33.11の仮想マシンからもログインできました。

禁止後は、下リストのようにちゃんと拒否されてます。

 

※アクセスできることが確認出来たら、SSHのポート設定を変更をした端末からログアウトしても大丈夫です。

rich-listの削除手順

rich-listを削除する方法です。

例えば、先ほど追加したのは、192.168.33.1 からのアクセス許可でしたが、IPアドレスを192.168.33.0/30 と範囲指定すると、最後の2ビット(32-30=2)は気にしないという意味になり、192.168.33.0~192.168.33.3 までの4つのIPアドレスからのアクセスが許可されます。実際には 末尾 0 はホスト割当としては使えないので、末尾1~3の3台ですね。

 ということで、rich-listの削除方法ですが、 --remove-rich-rule オプションを指定します。内容には、 --add-rich-rule  で設定した部分すべての指定が必要になるため、いったん --list-all  でルールを表示させて、ルール部分をすべて コピーペーストするようにしましょう。

ということで、下リストが list-all の結果です。下の例ではすでに、プリフィックス表示(/30でネットワーク部を指定している表示方式)のrich rule を追加しています。

 

では、「rule family=”ipv4″ source address=”192.168.33.1″ port port=”22″ protocol=”tcp” accept」の部分を丸々コピーして、 --remove-rich-rule を実行しましょう。

コピーしたルールには、「”」(ダブルクォーテーション)が使われているので「’」(シングルクォーテーション)でくくります。

 

--reload  で設定を有効にして、 --list-all で設定を確認します。

 

これで、削除できました。

※繰り返しになりますが、SSHのポート変更したときは、ログアウトする前に、別端末でログインできるかのチェックをしておきましょう。

※vagrant使ってる場合について注意 vagrant up で接続できなくなります

vagrant の仮想マシンの場合、IPアドレスで制限するなら、10.0.2.2からのアクセスも許可しておきましょう。

192.168.33.1 など、Vagrantfileで設定したIPアドレス空間のホストOS側IPアドレスでだけポート22の許可をすると、 vagrant up の起動時にsshすることができず、初期化ができません。その結果、/vagrant のマウントができません。

vagrant up の時、または、 vagrant ssh でのログインは、10.0.2.2 からのアクセスになるようです。

これは、Vagrantファイルで、

のネットワーク設定をしなくても、 vagrant up 時に接続して設定できることや、 vagrant ssh  できることからも別系統でひそかにつながっているということが分かりますよね。

vagrantの仮想マシン(ゲストOS)側からは、常にホストOSに 10.0.2.2 でアクセスできます。

まとめ

CentOS7 にデフォルトで入っているfirewalld というファイアーウォールアプリを使った、ポート制御の方法を説明しました。

この記事の内容を理解しておけば、とりあえずは、困ることはないと思います。ぜひ、トライしてみて下さい。

 

SSHは、安全性を高めるため、特定IPアドレスからだけアクセスを許可することが望ましいです。SSHに関しては、ほかにも、公開鍵を使ってパスワードをネットワーク上で転送しないような方法も使った方がより安全なため、また、別途、やり方を記事にしたいと思います。

ちなみにホストOSからしかアクセスしない仮想マシンでは、firewalld を起動する必要はないですが、本番サーバーの設定前に試すという意味では、有効ですね。

 

 

この記事が気に入ったら
いいね ! しよう

コメント