CentOS 7 chronydfail2banfirewalldselinuxsudoyum

CentOS 7 インストール後の初期設定を行う〜セキュリティ強化〜

tokyo-4436914 CentOS 7
スポンサーリンク
  1. 概要
  2. sudo コマンドを使用
    1. root ユーザで設定を行います。
    2. sudo 設定ファイルを編集します。
    3. wheel グループに該当ユーザ ( 例:admin ) を追加します。
  3. SELinux を無効化
  4. SSH 用ポート番号を変更
    1. sshd デーモンを再起動します。
    2. Firewall で変更したポート番号をオープンします。
    3. 変更内容を確認します。
    4. クライアント ( Macbook ) からアクセスして見ます。
  5. Firewall を設定
    1. TELET、FTP 使用 (X) / SSH、SCP 使用 (O)
    2. ipv6 を永久無効化します ( 任意 )
  6. Fail2Ban を設定
    1. epel リポジトリをインストールします。
    2. Fail2Ban 関連パッケージをインストールします。
    3. Fail2Ban 設定ファイルを編集します。
    4. Fail2Ban と Firewalld を起動して、サービス自動起動を有効にします。
    5. Fail2Ban デーモンの状態を確認します。
    6. Ban された IP アドレスを確認します。
  7. Telnet サービスを追加 ( 任意 )
    1. telnet を起動して、サービス自動起動を有効にします。
  8. 標準時刻 ( Chronyd ) を設定
    1. chronyd 設定ファイルに NTP サーバを指定します。
    2. 時刻の差が大きい場合は、NTP サーバが起動されないため、手動で時刻を合わせておきます。
    3. chronyd を起動して、サービス自動起動を有効にします。
    4. chronyd 状態を確認します。
    5. chronyd がアクセスしている現在のタイムソース情報を確認します。
    6. timedatectl コマンドで時刻情報を確認できます。
  9. パッケージ管理システム ( yum ) を設定

概要

CentOS 7 をインストールした後、セキュリティ面を顧慮した初期設定を行います。

初期設定をどのレベルまですれば良いか、に対する答えは様々でしょうが、本稿ではサーバへの不正アクセスを防止する事と、システム運用のための最小限の設定に焦点を当てて紹介します。

CentOS 7 をインストールする方は、CentOS 7.7 をインストールする〜NetInstallを利用〜 記事をご覧ください。また、本稿はの記事の続きとして作成したものです。

sudo コマンドを使用

セキュリテイイシューのため、普段 root アカウントは使用しません。
代わりに、一般ユーザに root 権限を付与するための sudo コマンドを設定します。

root ユーザで設定を行います。

CentOS マシーンを ( 再 ) 起動してコンソール画面で root ログインします。
( 一般ユーザアカウントの作成前 )

[root@centos7 ~]#

useraddpasswd コマンドで一般ユーザ ( 例:admin ) を作成します。

[root@centos7 ~]# useradd admin

[root@centos7 ~]# passwd admin
Changing password for user admin.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@centos7 ~]# 

sudo 設定ファイルを編集します。

visudo コマンドで /etc/sudoers ファイルを修正できます。

[root@centos7 ~]# visudo

wheel グループのユーザに全てのコマンド実行を許可します。

#%wheel ALL=(ALL) ALL

↓↓↓ コメントアウトします。

%wheel ALL=(ALL) ALL

ファイルを保存して閉じます。

wheel グループに該当ユーザ ( 例:admin ) を追加します。

admin ユーザの所属グループを確認します。デフォルトでは wheel グループになっていません。groups USERNAME コマンドで各 USERNAME が所属するグループを表示します。( USERNAME : GROUPNAME )

[root@centos7 ~]# groups admin
admin : admin

usermod -aG  <追加グループ名> <追加ユーザ名> コマンドで wheel グループに admin ユーザを追加します。

[root@centos7 ~]# usermod -aG wheel admin

変更内容を確認します。

[root@centos7 ~]# groups admin
admin : admin wheel

ssh でリモート接続し、 sudo コマンドで root 権限を獲得して見ます。

try🐶everything backend$ ssh admin@centos7 -p20190
The authenticity of host ‘[centos7]:20190 ([10.x.1.x]:20190)’ can’t be established.
ECDSA key fingerprint is SHA256:j4CnVGyLfoBjFNyYrK9qcf9q/Lpqa1Y5LOmsEjplTRU.
ECDSA key fingerprint is MD5:aa:e4:1c:e4:93:83:ee:33:8e:2d:b2:a6:37:a9:e8:dd.
Are you sure you want to continue connecting (yes/no)? yes ← yesを入力します。
Warning: Permanently added ‘[centos7]:20190,[10.x.1.x]:20190’ (ECDSA) to the list of known hosts.
admin@centos7’s password:    ← adminユーザのパスワードを入力します。
[admin@centos7 ~]$

[admin@centos7 ~]$ sudo su –
You should have received a regular course from your system administrator.
This is usually summarized in the following three points:
# 1) Respect the privacy of others.
# 2) Think before typing.
# 3) A great power is accompanied by a great responsibility.
[sudo] admin password:   ← adminユーザのパスワードを入力します。
[root@centos7 ~]#     ← root権限を獲得しました!

/etc/group ファイルを確認してみると、wheel グループに admin ユーザが追加されているはずです。

[root@centos7 ~]# cat /etc/group | grep wheel
wheel:x:10:user1,admin

SELinux を無効化

SELinuxRedhat 系のディストリビューションである CentOS や Fedora の場合、デフォルトで導入されているシステムです。細かくアクセスを制御できますが、作業時などむしろ邪魔になる場合が多く ( 私見 )、無効化して置いて、firewalld で外部とのアクセスを制御します。

# SELinux を無効化します。
[root@centos7 ~]# getenforce   ← SELinux 状態確認
Enforcing   ← SELinux 有効状態
[root@centos7 ~]# setenforce 0   ← SELinux 無効化する
[root@centos7 ~]# getenforce    ← SELinux 状態確認
Permissive   ← SELinux 無効

# システム起動時 SELinux を無効化します。
[root@centos7 ~]# vi /etc/sysconfig/selinux   ← SELinux 設定ファイルを編集
SELINUX=enforcing

↓↓↓ 修正します。

SELINUX=disabled

SSH 用ポート番号を変更

Well-known Port ( 0~1023 ) 以外のポート番号 ( 1024〜65535 )から未使用の番号を任意で指定することで ssh で使用するポート番号を変更できます。

sshd_config ファイルを開き、下記のように Port 22Port <任意の番号> に変更します。
( ここでは 20190 ポートに変更 )

[root@centos7 ~]# vi /etc/ssh/sshd_config
...
# 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

↓↓↓

Port 20190

...

sshd デーモンを再起動します。

[root@centos7 ~]# systemctl restart sshd.service 

Firewall で変更したポート番号をオープンします。

[root@centos7 ~]# firewall-cmd --permanent --zone=public --add-port=20190/tcp 

[root@centos7 ~]# firewall-cmd --reload

変更内容を確認します。

sshd デーモンが 22/tcp ではなく、20190/tcp ポートでリスニングしています。

[root@centos7 ~]# ss -tnlp | grep ssh
LISTEN 0 128 *:20190 *:* users:((“sshd“,pid=11044,fd=3))
LISTEN 0 128 [::]:20190 [::]:* users:((“sshd“,pid=11044,fd=4))

クライアント ( Macbook ) からアクセスして見ます。

centos7/etc/hosts ファイルに設定したホスト名です。未設定の場合、サーバの IP アドレス を記入します。

try🐶everything ~$ ssh admin@centos7 -p20190    # OR, ssh admin@server_ip_address -p20190
admin@centos7's password:
[admin@centos7 ~]$ 

Firewall を設定

必要なサービスだけオープンしておきます。
※ サーバ役割の例:samba http dns smtp smtps ssh https imaps

[root@centos7 ~]# firewall-cmd --add-service=dns --zone=public --permanent
[root@centos7 ~]# firewall-cmd --add-service=http --zone=public --permanent
[root@centos7 ~]# firewall-cmd --add-service=https --zone=public --permanent
[root@centos7 ~]# firewall-cmd --add-service=imaps --zone=public --permanent
[root@centos7 ~]# firewall-cmd --add-service=smtps --zone=public --permanent
[root@centos7 ~]# firewall-cmd --add-service=smtp --zone=public --permanent
[root@centos7 ~]# firewall-cmd --add-service=samba --zone=public --permanent
[root@centos7 ~]# firewall-cmd --zone=public --permanent --add-port=20190/tcp

# リロードして変更内容を反映します。
[root@centos7 ~]# firewall-cmd --reload

firewall-cmd –list-all コマンドで適用済みのルールを確認できます。サービス名だけ確認するには –list-service オプションを使用します。

[root@centos7 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: p1p1
  sources: 
  services: dns http https imaps samba smtp smtps ssh
  ports: 20190/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

[root@centos7 ~]# firewall-cmd --list-service
dns http https imaps samba smtp smtps ssh

TELET、FTP 使用 (X) / SSH、SCP 使用 (O)

必要で無ければ telnetvsftpd などは設置しない、もしくは disable しておきましょう。

[SSH 使用] 個人のノートPCからサーバへアクセスする例:
try🐶everything Downloads$ ssh admin@centos7 -p 20190

[SCP 使用] 個人のノートPCから特定のファイルをサーバ上にコピーする例:
try🐶everything ~$ cd Downloads/
try🐶everything Downloads$ scp -P 20190  ./* admin@centos7:/home/admin/backup

ipv6 を永久無効化します ( 任意 )

[root@centos7 ~]# echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf 

Fail2Ban を設定

外部に公開中のサーバを運用すると sshsmtpauth などで不正に認証しようと無数のトライが毎日入ってきます。パスワードの設定が単純する場合、ハッキングされる恐れもあるため Fail2Ban を適用します。

Fail2Ban は特定の IP から数秒の間に数回以上の認証失敗が繰り返されると、その IP アドレスからのアクセスを自動的に拒否するように設定できます。

CentOS7 では一般的に firewalld と連携して使用しますが、ここでは SSH について設定してみます。

epel リポジトリをインストールします。

epel-release repository がインストールされていない場合、エラーが発生しますので、最初にインストールします。

[root@centos7 ~]# yum install epel-release

# fail2ban が設置できない場合は、削除 → 設置順に行います。
[root@centos7 ~]# yum remove epel-release
[root@centos7 ~]# yum install epel-release

Fail2Ban 関連パッケージをインストールします。

[root@centos7 ~]#  yum install fail2ban fail2ban-systemd firewalld

Fail2Ban 設定ファイルを編集します。

下記のように jail.local ファイルを作成して監視対象と条件を定義します。

[root@centos7 ~]# vi /etc/fail2ban/jail.d/jail.local

[sshd]
enabled = true

[INCLUDES]
before = paths-fedora.conf

# 無視するネットワーク
ignoreip = 127.0.0.1/8 192.168.11.0/24

# 12 時間内に 5 回認証失敗すると1日間 BAN
bantime = 86400
findtime = 43200
maxretry = 5

backend = systemd

banaction = firewallcmd-ipset

[sshd]
port = 20190     ← ssh のポート番号を変更したので
logpath = %(sshd_log)s
backend = %(sshd_backend)s
journalmatch =     ← backend を systemd に変更した場合のみ、左のように追記

Fail2Ban と Firewalld を起動して、サービス自動起動を有効にします。

# 設定ファイルを保存して fail2ban と firewalld を起動します。
[root@centos7 ~]# systemctl start firewalld
[root@centos7 ~]# systemctl start fail2ban

# fail2ban と firewalld のサービス自動起動を有効にします。
[root@centos7 ~]# systemctl enable fail2ban
[root@centos7 ~]# systemctl enable firewalld

Fail2Ban デーモンの状態を確認します。

[root@centos7 ~]# systemctl status fail2ban.service 
● fail2ban.service - Fail2Ban Service
   Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2019-10-23 17:35:27 JST; 1h 43min ago
     Docs: man:fail2ban(1)
  Process: 1617 ExecStart=/usr/bin/fail2ban-client -x start (code=exited, status=0/SUCCESS)
 Main PID: 2461 (fail2ban-server)
   CGroup: /system.slice/fail2ban.service
           └─2461 /usr/bin/python2 -s /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock ...

Oct 23 17:35:21 centos7 systemd[1]: Starting Fail2Ban Service...
Oct 23 17:35:26 centos7 fail2ban-client[1617]: 2019-10-23 17:35:26,907 fail2ban.server         [...9.7
Oct 23 17:35:26 centos7 fail2ban-client[1617]: 2019-10-23 17:35:26,907 fail2ban.server         [...ode
Oct 23 17:35:27 centos7 systemd[1]: Started Fail2Ban Service.
[root@centos7 ~]# 

Ban された IP アドレスを確認します。

[root@centos7 ~]# fail2ban-client status sshd

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 0
|  `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned: 0
   `- Banned IP list:
[root@centos7 ~]#

または、ipset –list コマンドで確認できます。

[root@centos7 ~]#  ipset --list
Name: fail2ban-sshd
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536 timeout 86400
Size in memory: 120
References: 1
Number of entries: 0
Members:

[root@centos7 ~]#

ログを確認します。

[root@centos7 ~]# tail -f /var/log/fail2ban.log
2019-10-23 17:35:27,674 fail2ban.jail           [2461]: INFO    Initiated 'systemd' backend
2019-10-23 17:35:27,676 fail2ban.filter         [2461]: INFO    Set maxRetry = 5
2019-10-23 17:35:27,677 fail2ban.filter         [2461]: INFO    Set jail log file encoding to UTF-8
2019-10-23 17:35:27,678 fail2ban.actions        [2461]: INFO    Set banTime = 86400
2019-10-23 17:35:27,678 fail2ban.filter         [2461]: INFO    Set findtime = 600
2019-10-23 17:35:27,679 fail2ban.filter         [2461]: INFO    Set maxlines = 10
2019-10-23 17:35:27,731 fail2ban.filtersystemd  [2461]: INFO    Added journal match for: '_SYSTEMD_UNIT=sshd.service + _COMM=sshd'
2019-10-23 17:35:27,820 fail2ban.jail           [2461]: INFO    Jail 'sshd' started
2019-10-23 17:36:37,978 fail2ban.filter         [2461]: INFO    [sshd] Ignore x.x.x.x by ip
2019-10-23 17:36:39,907 fail2ban.filter         [2461]: INFO    [sshd] Ignore x.x.x.x by ip

Telnet サービスを追加 ( 任意 )

CentOSminimal オプションでインストールすると、telnet コマンドが入っていません。デバッグやローカルでのテストのため、追加しておきます。

[root@centos7 ~]# yum list installed | grep telnet
[root@centos7 ~]# yum -y install telnet telnet-server

telnet を起動して、サービス自動起動を有効にします。

[root@centos7 ~]# systemctl list-unit-files | grep telnet.socket
telnet.socket                                 enabled

[root@centos7 ~]# systemctl start telnet.socket
[root@centos7 ~]# systemctl status telnet.socket
● telnet.socket - Telnet Server Activation Socket
   Loaded: loaded (/usr/lib/systemd/system/telnet.socket; enabled; vendor preset: disabled)
   Active: active (listening) since Wed 2019-10-23 17:34:57 JST; 2h 27min ago
     Docs: man:telnetd(8)
   Listen: 0.0.0.0:23 (Stream)
 Accepted: 0; Connected: 0

Oct 23 17:34:57 centos7 systemd[1]: Listening on Telnet Server Activation Socket.

[root@centos7 ~]# systemctl enable telnet
telnet@        telnet.socket
[root@centos7 ~]# systemctl enable telnet.socket
Created symlink from /etc/systemd/system/sockets.target.wants/telnet.socket to /usr/lib/systemd/system/telnet.socket.

標準時刻 ( Chronyd ) を設定

CentOS 7Minimal Installation 以外のオプションで設置した場合、chronyd が標準 NTP クライアント・サーバとして設置されます。
chronyd パッケージを設置する場合、yum install chronyd コマンドでインストールできます。

chronyd 設定ファイルに NTP サーバを指定します。

[root@centos7 ~]# cp /etc/chrony.conf /etc/chrony.conf.orgin

[root@centos7 ~]# vi /etc/chrony.conf
Use public servers from the pool.ntp.org project.
Please consider joining the pool (http://www.pool.ntp.org/join.html).

server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst


↓↓↓変更します。

server ntp.nict.jp iburst    ← 日本標準時を提供しているNTPサーバ(Stratum1)
server ntp.jst.mfeed.ad.jp iburst   ← 上記サーバと直接同期しているNTPサーバ(Stratum2)

Record the rate at which the system clock gains/losses time.

iburst オプションを追加すると、起動時に Sync を 4 回トライしますので結果的により迅速に Sync されます。 ( ntpd は 8 回トライ )

時刻の差が大きい場合は、NTP サーバが起動されないため、手動で時刻を合わせておきます。

[root@centos7 ~]# ntpdate ntp.nict.jp
23 Oct 15:53:37 ntpdate[13039]: adjust time server 133.243.238.164 offset -0.003463 sec

chronyd を起動して、サービス自動起動を有効にします。

[root@centos7 ~]# systemctl start chronyd
[root@centos7 ~]# systemctl enable chronyd

chronyd 状態を確認します。

[root@centos7 ~]# systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-10-23 15:45:02 JST; 9s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: 12691 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: 12687 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 12689 (chronyd)
   CGroup: /system.slice/chronyd.service
           └─12689 /usr/sbin/chronyd

Oct 23 15:45:02 centos7 systemd[1]: Starting NTP client/server...
Oct 23 15:45:02 centos7 chronyd[12689]: chronyd version 3.4 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDN... +DEBUG)
Oct 23 15:45:02 centos7 chronyd[12689]: Frequency -5.344 +/- 2.815 ppm read from /var/lib/chrony/drift
Oct 23 15:45:02 centos7 systemd[1]: Started NTP client/server.
Oct 23 15:45:07 centos7 chronyd[12689]: Selected source 210.173.160.57
Oct 23 15:45:09 centos7 chronyd[12689]: Selected source 133.243.238.164
Hint: Some lines were ellipsized, use -l to show in full.

chronyd がアクセスしている現在のタイムソース情報を確認します。

[root@centos7 ~]# chronyc sources
210 Number of sources = 2
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* ntp-b3.nict.go.jp             1   6   377    48  +5709us[+6625us] +/-   11ms
^- ntp2.jst.mfeed.ad.jp          2   6   377    47    +13ms[  +13ms] +/-  107ms

OR,

[root@centos7 ~]# chronyc sourcestats
210 Number of sources = 2
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
ntp-b3.nict.go.jp          18   9  1100     +0.349     12.713    +15us  3225us
ntp2.jst.mfeed.ad.jp       19  11  1102     +0.314     14.262  +5689ns  4057us
時刻の同期可否を確認するには

chronyc sources コマンドを実行 () し、最初の MS カラム から時刻同期状態を確認できます。
chronyc-sources-command

を観ると、chronydntp-b3-nict.go.jp サーバと同期していることがわかります。

MS カラムの見方
  • M
    ソースのモードを示します。
    ^サーバ ( Server )
    =ピア ( Peer )
    #ローカルに接続された基準クロック
  • S
    ソースの状態を示します。
    *chronyd が現在同期されているソース
    +選択されたソースと組み合わされる許容可能なソース
    結合アルゴリズムによって除外される許容可能なソース
    接続が失われたソース、またはパケットがすべてのテストに合格しないソース
    xchronydfalseticker と見なしているクロック ( 時刻が他の大部分と不一致 )
    時間が変動しすぎているように見えるソース

timedatectl コマンドで時刻情報を確認できます。

[root@centos7 ~]# timedatectl
      Local time: Wed 2019-10-23 15:52:33 JST
  Universal time: Wed 2019-10-23 06:52:33 UTC
        RTC time: Wed 2019-10-23 06:52:33
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

パッケージ管理システム ( yum ) を設定

RPM パッケージのインストール/アンインストールを実行する yum の初期設定を行います。

▼ 設置済みの全てのパッケージをアップデートします。大量のパッケージがダウンロード&更新されるため、時間がかかります。

[root@centos7 ~]# yum -y update

パッケージ自動更新設定をします。

[root@centos7 ~]# yum -y install yum-cron     ← yum-cron をインストール
[root@centos7 ~]# vi /etc/yum/yum-cron.conf   ← yum-cron 設定
apply_updates = yes     ← ダウンロード&アップデートを自動で行う

[root@centos7 ~]# systemctl start yum-cron   ← パッケージ自動更新起動
[root@centos7 ~]# systemctl enable yum-cron  ← パッケージ自動更新・起動起動設定

Base、開発ツールパッケージ群を設置しておきます。

[root@centos7 ~]# yum -y groupinstall base "Development tools"

以上です。

スポンサーリンク

コメント

タイトルとURLをコピーしました