【さくらVPS】【CentOS7】Firewalld を設定する

さくらVPSを使ってWebサービスを公開しようという目標があります。

インフラ系のエンジニアですがプログラミングが趣味です。

現在さくらVPSを使ってリモートからアクセスをしてコマンドの動作検証などをしていますが、Webサービスの開発にも挑戦しようと思っています。

 

  • 目標:Webサービスを公開する
  • 懸念点:インターネットにサーバーをさらすということは、世界中からアクセスができるということになるため慎重に設計・構築を行う必要がある
  • 課題:まずはセキュリティから

 

 

ルーターやファイアウォールを経由せずにインターネットに晒されているならファイアウォールは必須

「Juniper」とか「Palo Alto」など専用のファイアウォールに守られているならサーバー上の「iptabled」や「Firewalld」を停止しても問題ないですが、「さくら VPS」はグローバルIPアドレスを割り当ててインターネットに晒されている状態なので、まずは「ファイアウォール」の設定から始める必要があります。

 

環境

CentOS 7.4

[root@SAKURA_VPS html]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

 

設計

DNS名でアクセスができるようにします。

 

【例】

http://ns-mall.com

 

アクセスできるポート

  • HTTP:80
  • SSH:22(自宅からのみ)

それ以外はすべてブロックします。

 

firewalld の設定手順

以下、CentOS7にリモートログインして、コマンドで設定を入れます。

 

firewalld.service の自動起動設定

初めに「firewalld.service」の自動起動の設定をします。

自動起動をONにすることでOSを再起動した際も自動的に「firewalld.service」が起動します。

[root@SAKURA_VPS ~]# systemctl list-unit-files | grep firewalld ← 現在の設定を確認します。
firewalld.service disabled ← 自動起動はOFFの状態です。
[root@SAKURA_VPS ~]# systemctl enable firewalld.service ← 自動起動をONの状態にします。
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.

[root@SAKURA_VPS ~]# systemctl list-unit-files | grep firewalld ← 再度現在の設定を確認します。
firewalld.service enabled ← 自動起動はONの状態です。
[root@SAKURA_VPS ~]#

 

 

firewalld.service の起動

設定が完了したら「firewalld.service」を起動します。

[root@SAKURA_VPS ~]# systemctl start firewalld.service ← firewalld を起動します。
[root@SAKURA_VPS ~]# systemctl status firewalld.service ← firewalld の状態を確認します。 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2017-09-23 00:36:28 JST; 5s ago
     Docs: man:firewalld(1)
 Main PID: 4823 (firewalld)
   CGroup: /system.slice/firewalld.service
           mq4823 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

 9月 23 00:36:28 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Starting firewalld - dynamic firewall d.....
 9月 23 00:36:28 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Started firewalld - dynamic firewall daemon.
 9月 23 00:36:29 tk2-250-34861.vs.sakura.ne.jp firewalld[4823]: WARNING: ICMP type 'beyond-scope' i....
 9月 23 00:36:29 tk2-250-34861.vs.sakura.ne.jp firewalld[4823]: WARNING: beyond-scope: INVALID_ICMP....
 9月 23 00:36:29 tk2-250-34861.vs.sakura.ne.jp firewalld[4823]: WARNING: ICMP type 'failed-policy' ....
 9月 23 00:36:29 tk2-250-34861.vs.sakura.ne.jp firewalld[4823]: WARNING: failed-policy: INVALID_ICM....
 9月 23 00:36:29 tk2-250-34861.vs.sakura.ne.jp firewalld[4823]: WARNING: ICMP type 'reject-route' i....
 9月 23 00:36:29 tk2-250-34861.vs.sakura.ne.jp firewalld[4823]: WARNING: reject-route: INVALID_ICMP....
Hint: Some lines were ellipsized, use -l to show in full.

 

 

現在のファイアウォールの設定確認

現在のファイアウォールの設定を確認します。

現在は

  • ftp
  • dhcpv6-client
  • ssh

です。

[root@SAKURA_VPS ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ftp dhcpv6-client ssh ← これらが現在firewalld.serviceにより解放されているサービスです。
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@SAKURA_VPS ~]#

 

 

firewalld の設定したい点・変更したい点

必要なサービス

  • ssh(アクセス元IPで絞らない、鍵認証にする)
  • http

の2つを許可するだけです。

現在「さくらVPS」を利用していますが、ssh はアクセス元IPのみ許可する設定に絞ろうかと思ったのですが、予期しない自体があるかもしれない(例えば外出先で緊急でログインしたい場合とか)のでアクセス元IPで絞ることをやめました。

※ただしアクセス元IPが変わってしまってリモートログインができなくなってしまったとしても、「さくらVPS」の場合はブラウザよりコンソールにアクセスできるので最悪の事態は免れます。

 

その代り「ssh」「鍵認証」にすることで、「鍵(ファイル)」を持っていて「パスフレーズ」を知っている人だけしかアクセスできないようにします。

そうすることでセキュリティを担保することができます。

 

今後 Web アプリを開発して公開したいので「http」を許可する設定にします。

(と言っても勉強目的なので立派なものはではないですが。。)

 

不要なサービスを外す

以下の不要なサービス「ftp」「dhcpv6-client」を外します。

※firewalld はデフォルトで以下のサービスを許可しています。

  • ftp
  • dhcpv6-client

 

 

■恒久的にサービスを外す場合

[root@SAKURA_VPS ~]# firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
success
[root@SAKURA_VPS ~]# firewall-cmd --permanent --zone=public --remove-service=ftp
success

 

--permanent オプションを付けることで、OSを再起動しても設定が残ります。一時的ではなく恒久対策として利用します。

※なぜ --permanet オプションがあるのかと言うと設定をミスった時にどうにもならなくなる事を避けるためです。(例えばデータセンターまで行ってコンソールの前から作業をしなければいけないとか・・・。iLOなどがあればコンソールからログインして作業はできますが)

 

 

設定を入れたら、反映させるために firewalld を再起動します。

[root@SAKURA_VPS ~]# systemctl restart firewalld
[root@SAKURA_VPS ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2017-09-23 11:45:13 JST; 8s ago
     Docs: man:firewalld(1)
 Main PID: 18077 (firewalld)
   CGroup: /system.slice/firewalld.service
           mq18077 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

 9月 23 11:45:13 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Starting firewalld - dynamic firewall d.....
 9月 23 11:45:13 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Started firewalld - dynamic firewall daemon.
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: ICMP type 'beyond-scope' ....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: beyond-scope: INVALID_ICM....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: ICMP type 'failed-policy'....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: failed-policy: INVALID_IC....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: ICMP type 'reject-route' ....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: reject-route: INVALID_ICM....
Hint: Some lines were ellipsized, use -l to show in full.
[root@SAKURA_VPS ~]# 

 

 

firewalld を再起動したら現在の設定を確認します。

[root@SAKURA_VPS ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh ← ssh だけになりました。
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@SAKURA_VPS ~]#

 

 

必要なサービスを追加する【サービス単位での追加手順】

次に必要なサービス「http」を追加します。

※ポート番号で指定するのではなく、サービス名で登録する手順です。ポート番号で指定する手順は後程解説します。

[root@SAKURA_VPS ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[root@SAKURA_VPS ~]#

 

 

設定を入れたら、反映させるために firewalld を再起動します。

[root@SAKURA_VPS ~]# systemctl restart firewalld
[root@SAKURA_VPS ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2017-09-23 11:45:13 JST; 8s ago
     Docs: man:firewalld(1)
 Main PID: 18077 (firewalld)
   CGroup: /system.slice/firewalld.service
           mq18077 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

 9月 23 11:45:13 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Starting firewalld - dynamic firewall d.....
 9月 23 11:45:13 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Started firewalld - dynamic firewall daemon.
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: ICMP type 'beyond-scope' ....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: beyond-scope: INVALID_ICM....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: ICMP type 'failed-policy'....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: failed-policy: INVALID_IC....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: ICMP type 'reject-route' ....
 9月 23 11:45:14 tk2-250-34861.vs.sakura.ne.jp firewalld[18077]: WARNING: reject-route: INVALID_ICM....
Hint: Some lines were ellipsized, use -l to show in full.
[root@SAKURA_VPS ~]# 

 

 

firewalld を再起動したら現在の設定を確認します。

[root@SAKURA_VPS ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh http
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@SAKURA_VPS ~]#

 

 

必要なサービスを追加する【ポート番号での追加手順】

HTTP や FTP などサービス単位ではなく「ポート番号」での追加手順です。

例として「Submission ポート(587/TCP)」を追加する手順を解説します。

 

【作業前の設定】

[root@SAKURA_VPS ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh http https
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@SAKURA_VPS ~]#

 

 

以下のコマンドを実行します。

[root@SAKURA_VPS ~]# firewall-cmd --permanent --zone=public --add-port=587/tcp
success
[root@SAKURA_VPS ~]#

 

 

「success」を確認したら、firewalld を再起動します。

[root@SAKURA_VPS ~]# systemctl restart firewalld

 

 

設定内容を確認します。

[root@SAKURA_VPS ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh http https
  ports: 587/tcp ← ここに 587/tcp が追加されています。
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@SAKURA_VPS ~]#

 

 

 

サービス名&ポート番号一覧表

Submission ← 587/tmp

 

 

SSH を公開鍵認証にする手順

ここまで完了したら次は「さくらVPS」への SSH アクセスを「鍵認証」にする手順ですが、以下を参考にしてください。

 

【Linux】SSH 公開鍵認証の設定手順【図解】

 

 

 

SSH でパスワード認証を拒否する

サーバーへのログインを「SSH 鍵認証」のみに設定します。

→パスワード認証ができなくなります。

 

下記は「/etc/ssh/sshd_config」です。

下記だけで公開鍵認証方式でリモートログインできました。

[root@SAKURA_VPS ~]# vi /etc/ssh/sshd_config
#       $OpenBSD: sshd_config,v 1.93 2014/01/10 05:59:19 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/usr/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

# The default requires explicit activation of protocol 1
#Protocol 2

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 1024

# Ciphers and keying
#RekeyLimit default none

# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
#PermitRootLogin yes
PermitRootLogin no ← no に設定しました。
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#RSAAuthentication yes
#PubkeyAuthentication yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes ← コメントアウトしました。
#PermitEmptyPasswords no

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes

# GSSAPI options
#GSSAPIAuthentication yes
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
# problems.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
UsePrivilegeSeparation sandbox          # Default for new installations.
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server
[root@SAKURA_VPS ~]#

 

 

この後、sshd.service を再起動します。

[root@SAKURA_VPS ~]# systemctl restart sshd.service
[root@SAKURA_VPS ~]# systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2017-09-23 16:02:03 JST; 9s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 19108 (sshd)
   CGroup: /system.slice/sshd.service
           mq19108 /usr/sbin/sshd -D

 9月 23 16:02:03 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Starting OpenSSH server daemon...
 9月 23 16:02:03 tk2-250-34861.vs.sakura.ne.jp sshd[19108]: Server listening on 0.0.0.0 port 22.
 9月 23 16:02:03 tk2-250-34861.vs.sakura.ne.jp sshd[19108]: Server listening on :: port 22.
 9月 23 16:02:03 tk2-250-34861.vs.sakura.ne.jp systemd[1]: Started OpenSSH server daemon.
[root@SAKURA_VPS ~]#

 

 

その後、SSH でログインができればOKです。

※念のため(sshd_configの設定が間違えている可能性があるため)、1セッションを残して別ウィンドウでログイン確認をします。

【Linux】SSH 公開鍵認証の設定手順【図解】

 

もしリモートログインができない場合は、残っているセッションからコンフィグを元に戻して再度調査をします。

 

 

念のために、パスワード認証で拒否されるか確認します。

以下のように「SSH2自動ログインエラー:ユーザー認証が失敗しました。サーバでサポートされていない認証方法です。」が表示されればOKです。

【Linux】SSH 公開鍵認証の設定手順【図解】

 

 

まとめ

以上でセキュリティは向上したと思います。

今回さくらVPSでファイアウォールを設定しましたが、さくらVPSのメリットとしてはブラウザより「コンソール」にアクセスができるところです。

最悪、ファイアウォールの設定をミスったり、SSHの鍵認証の設定をミスってもコンソールから復旧させることができます。

これがAWSだと「コンソール」へのアクセスができないため、スナップショットから戻すか、再度構築しなおすかする必要があります。

 

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。