概要
CentOS 7 をインストールした後、セキュリティ面を顧慮した初期設定を行います。
初期設定をどのレベルまですれば良いか、に対する答えは様々でしょうが、本稿ではサーバへの不正アクセスを防止する事と、システム運用のための最小限の設定に焦点を当てて紹介します。
CentOS 7 をインストールする方は、CentOS 7.7 をインストールする〜NetInstallを利用〜 記事をご覧ください。また、本稿は↑の記事の続きとして作成したものです。
sudo コマンドを使用
セキュリテイイシューのため、普段 root アカウントは使用しません。
代わりに、一般ユーザに root 権限を付与するための sudo コマンドを設定します。
root ユーザで設定を行います。
CentOS マシーンを ( 再 ) 起動してコンソール画面で root ログインします。
( 一般ユーザアカウントの作成前 )
[root@centos7 ~]#
useradd と passwd コマンドで一般ユーザ ( 例: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 グループに該当ユーザ ( 例: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 権限を獲得して見ます。
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 を無効化
SELinux は Redhat 系のディストリビューションである 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 22 を Port <任意の番号> に変更します。
( ここでは 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 ポートでリスニングしています。
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)
必要で無ければ telnet、vsftpd などは設置しない、もしくは disable しておきましょう。
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 を設定
外部に公開中のサーバを運用すると ssh、smtp、auth などで不正に認証しようと無数のトライが毎日入ってきます。パスワードの設定が単純する場合、ハッキングされる恐れもあるため 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 ファイルを作成して監視対象と条件を定義します。
[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 サービスを追加 ( 任意 )
CentOS をminimal オプションでインストールすると、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 7 の Minimal Installation 以外のオプションで設置した場合、chronyd が標準 NTP クライアント・サーバとして設置されます。
※ chronyd パッケージを設置する場合、yum install chronyd コマンドでインストールできます。
chronyd 設定ファイルに NTP サーバを指定します。
[root@centos7 ~]# cp /etc/chrony.conf /etc/chrony.conf.orgin
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
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 ~]# 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"
以上です。
コメント