Locked

sakura_VPS_setup_700

さくらVPS 1G/SSD プラン - CentOS7 初期設定

2017.5頃の情報を基に作成しています。
リンク先の資料等、当サイトの記事と異なる場合があります。最新の内容を確認してください。

当記事作成時、yum update後のバージョンは以下の通り。

$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

仮想マシン起動

契約した時点では、仮想マシンは起動していない状態なので、VPSコントロールパネルから起動する必要があります。SSDモデルでもあり仮想マシンの起動は高速です。
契約処理後、メールでアカウント情報(CentOS6/標準インストール時のもの)が送られてきますが、CentOS7のインストールによりrootアカウントを再設定することになります。

サービス仕様確認

特筆すべきはSELinux無効化と、IPv6インターフェースの無効化でしょうか。
これらを使用する場合、個別に有効化/設定する必要があります。

$ grep -v ^# /etc/sysconfig/selinux
SELINUX=disabled
SELINUXTYPE=targeted

$ cat /etc/sysctl.d/99-sysctl.conf
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

# Do not accept RA
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.eth0.accept_ra=0
# Do not use IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

日本語環境切替

デフォルトでは英語環境になっているので日本語環境に切り替えます。

# localectl
   System Locale: LANG=C
       VC Keymap: jp106
      X11 Layout: jp

# localectl set-locale LANG=ja_JP.utf8
# localectl
   System Locale: LANG=ja_JP.utf8
       VC Keymap: jp106
      X11 Layout: jp

etckeeper導入

設定を開始する前にetckeeperを導入します。
etckeeperは/etc配下のファイルをVCSで自動管理するためのツールです。
他の管理方法を取る場合、或いは管理しない場合は導入不要です。

初期設定よりepel(Extra Packages for Enterprise Linux)が利用できるようになっているので、追加設定することなくyumでインストール可能です。

# yum install etckeeper
...
================================================================================
 Package            アーキテクチャー
                                    バージョン              リポジトリー   容量
================================================================================
インストール中:
 etckeeper          noarch          1.18.5-1.el7            epel           43 k

トランザクションの要約
================================================================================
インストール  1 パッケージ

総ダウンロード容量: 43 k
インストール容量: 65 k
Is this ok [y/d/N]: 

デフォルトでは Git を使用するようになっています。
MercurialやBazaar、Darcs といった VCS も利用可能なので、必要であれば慣れたものに変更するといいでしょう。

$ grep ^VCS /etc/etckeeper/etckeeper.conf
VCS="git"

初期化します。

# etckeeper init
Initialized empty Git repository in /etc/.git/

最初の状態をコミットします。

# etckeeper commit 'init'

作業ユーザ作成

ポリシー設定

ユーザ作成に関するポリシーについて、関連するファイル/ディレクトリを確認/設定します。

/etc/login.defs
/etc/default/useradd
/etc/skel/

useraddコマンドによるデフォルト値を確認。

# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

useraddによるデフォルトのGIDは100(users)なのですが、login.defsによって最小値が1000に制限されており、明示的に指定しない場合はUIDと同じGIDでgroupが追加されます。

$ grep ID_MIN /etc/login.defs
UID_MIN                  1000
SYS_UID_MIN               201
GID_MIN                  1000
SYS_GID_MIN               201

CentOS6は最小値が500なので、CentOS6からCentOS7への移行を行う場合は、設定を合わせる等の対応が必要になるかもしれません。

useraddによるユーザ作成時、/var/spool/mail下にメールスプールを作成しないようにします。

--- a/default/useradd
+++ b/default/useradd
@@ -5,5 +5,5 @@
 INACTIVE=-1
 EXPIRE=
 SHELL=/bin/bash
 SKEL=/etc/skel
-CREATE_MAIL_SPOOL=yes
+CREATE_MAIL_SPOOL=no

root権限へのスイッチ手段設定

サーバ管理ポリシーを決めて、必要に応じて設定します。
以下は、サーバローカルだけで完結する設定の一例です。

  • PAMを利用する

wheelグループに属しているアカウント以外suが使えなくなります。また、su使用時パスワード認証が不要になります。

--- a/pam.d/su
+++ b/pam.d/su
@@ -1,9 +1,9 @@
 #%PAM-1.0
 auth           sufficient      pam_rootok.so
 # Uncomment the following line to implicitly trust users in the "wheel" group.
-#auth          sufficient      pam_wheel.so trust use_uid
+auth           sufficient      pam_wheel.so trust use_uid
 # Uncomment the following line to require a user to be in the "wheel" group.
-#auth          required        pam_wheel.so use_uid
+auth           required        pam_wheel.so use_uid
 auth           substack        system-auth
 auth           include         postlogin
 account                sufficient      pam_succeed_if.so uid = 0 use_uid quiet
  • sudoを利用する

wheelグループに属しているアカウントをパスワード認証無しでrootにスイッチ出来るようにします。

--- a/sudoers
+++ b/sudoers
@@ -105,7 +105,7 @@ root        ALL=(ALL)       ALL
 %wheel ALL=(ALL)       ALL

 ## Same thing without a password
-# %wheel       ALL=(ALL)       NOPASSWD: ALL
+%wheel ALL=(ALL)       NOPASSWD: ALL

 ## Allows members of the users group to mount and unmount the
 ## cdrom as root

アカウント作成

例示として「yourname」というアカウントを作成しています。
上の設定に基づき、rootにスイッチ出来るようwheelグループに追加します。

# useradd -G wheel yourname

上の例では、新たに「yourname」というgroupが追加され、デフォルトのグループに設定されます。

# tail -1 /etc/passwd
yourname:x:1000:1000::/home/yourname:/bin/bash

# grep yourname /etc/group
wheel:x:10:yourname
yourname:x:1000:

アカウント毎にgroupを追加したくない場合は、予めgroupを作成しておいたもの(或いはusers等の既設group)を「-g」オプションで指定します。

作成したアカウントにパスワードを設定します。

# passwd yourname
ユーザー yourname のパスワードを変更。
新しいパスワード:

useraddの「-p」オプションでアカウント作成時に設定(予めhash化された値を使用)することも可能です。

rootアカウント/パスワードロック

ここまでの設定が正しく行われていれば、rootアカウントのパスワードをロックしても作業アカウントからrootになれます。
仮想マシン等、シングルユーザモードが必要にならない環境であれば、パスワードロックしてしまうという運用も一考です。

# passwd -l root
ユーザー root 用のパスワードをロック。
passwd: 成功

万が一に備え、作業を実施するターミナルをroot権限のままにしておき、新たに作業アカウントでログインしてrootにスイッチ出来る事を確認します。

sshd/firewalld初期設定

さくらVPSの初期設定では、sshdはリモートからrootログイン可能で、firewalldはpublicゾーン(sshd/dhcpv6-client)が適用されています。
また、fail2banがインストール/起動されているため、少しばかりセキュアに(sshで外部からログインされにくく)なっています。

# firewall-cmd --get-active-zones
public
  interfaces: eth0

# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
</zone>

# systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
   Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2017-05-31 00:41:32 JST; 1 day 12h ago
     Docs: man:fail2ban(1)
 Main PID: 1201 (fail2ban-server)
   CGroup: /system.slice/fail2ban.service
           └─1201 /usr/bin/python2 -s /usr/bin/fail2ban-server -s /var/run/fa...
...

初期起動時から1日で、かなりの攻撃(ログイン試行)をくらっています。

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     435
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned:     55
   `- Banned IP list:

Ban中のアドレス確認。

# ipset --list
Name: fail2ban-sshd
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536 timeout 600
Size in memory: 19856
References: 1
Members:

sshd設定

基本方針として、使用しない機能はオフにします。

ポートは変えなければならない、というよりは、変えるだけで避けられるリスクが多いので(接続元を制限出来ないのであれば)変えた方が良いと考えます。
以下では例示としてポートを「2345」に、プロトコルバージョンを「2」のみに、rootログインを拒否するよう変更しています。

--- a/ssh/sshd_config
+++ b/ssh/sshd_config
@@ -15,12 +15,14 @@
 # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
 #
 #Port 22
+Port 2345
 #AddressFamily any
 ListenAddress 0.0.0.0
 #ListenAddress ::

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

 # HostKey for protocol version 1
 #HostKey /etc/ssh/ssh_host_key
@@ -47,6 +49,7 @@ SyslogFacility AUTHPRIV

 #LoginGraceTime 2m
 #PermitRootLogin yes
+PermitRootLogin no
 #StrictModes yes
 #MaxAuthTries 6
 #MaxSessions 10

設定をチェック/適用します。

# sshd -t
# systemctl reload sshd

firewalldにより変更後のポートにアクセス出来るよう設定する必要があります。

firewalld設定

sshdのポートを変更した場合、併せて変更します。

dhcpv6-clientは、将来的にIPv6を使用する場合でも不要なので削除します。

# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --add-port=2345/tcp --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent
# firewall-cmd --reload

fail2ban設定

sshdのポートを変更した/fail2banを継続利用する場合、併せて変更します。

--- a/fail2ban/jail.d/local.conf
+++ b/fail2ban/jail.d/local.conf
@@ -4,3 +4,4 @@ backend = systemd

 [sshd]
 enabled = true
+port = 2345

# systemctl reload fail2ban

起動サービス確認

インストール後の初期状態のようなので、不要なサービスは停止します。
SSDモデルの場合、容量の関係や使用していないのに更新がかかるという観点からは、削除した方が望ましいかもしれません。

以下の例では、ABRTサービス系と物理ディスク関連のサービスをdisableしています。

# systemctl disable abrt-ccpp
# systemctl disable abrt-oops
# systemctl disable abrt-vmcore
# systemctl disable abrt-xorg
# systemctl disable abrtd
# systemctl disable dmraid-activation
# systemctl disable libstoragemgmt
# systemctl disable smartd

$ systemctl list-unit-files --type=service | grep enabled
atd.service                                 enabled
auditd.service                              enabled
chronyd.service                             enabled
crond.service                               enabled
dbus-org.fedoraproject.FirewallD1.service   enabled
dbus-org.freedesktop.NetworkManager.service enabled
dbus-org.freedesktop.nm-dispatcher.service  enabled
fail2ban.service                            enabled
firewalld.service                           enabled
getty@.service                              enabled
irqbalance.service                          enabled
lvm2-monitor.service                        enabled
mdmonitor.service                           enabled
NetworkManager-dispatcher.service           enabled
NetworkManager.service                      enabled
postfix.service                             enabled
rngd.service                                enabled
rsyslog.service                             enabled
sshd.service                                enabled
sysstat.service                             enabled
systemd-readahead-collect.service           enabled
systemd-readahead-drop.service              enabled
systemd-readahead-replay.service            enabled
tuned.service                               enabled

dbus-org.freedesktop.network1.serviceのステータスがおかしい件。
現行バージョンのバグのようで、RHEL7.4以降でfixされるようです。

$ systemctl list-unit-files --type=service | egrep '(invalid|bad)'
dbus-org.freedesktop.network1.service         bad

そのままでも良いような気はしますが、bugzillaにあるよう、明示的に「masked」としておきます。

# systemctl mask dbus-org.freedesktop.network1.service
Created symlink from /etc/systemd/system/dbus-org.freedesktop.network1.service to /dev/null.

$ systemctl status dbus-org.freedesktop.network1.service
* dbus-org.freedesktop.network1.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

以下のようなエラーになる場合は、一度、リブートが必要です。

# systemctl mask dbus-org.freedesktop.network1.service
Failed to execute operation: Access denied

yum update

標準インストールのCentOS6はyum-updateonbootが有効になっていたのですが、CentOS7では無効になっていました。
また、リポジトリがOS標準の設定になっていますが、さくらのプライベートリポジトリにCentOS7もあるようなので、こちらを使用するように変更した方が良さそうです。

--- a/yum.repos.d/CentOS-Base.repo
+++ b/yum.repos.d/CentOS-Base.repo
@@ -12,32 +12,36 @@

 [base]
 name=CentOS-$releasever - Base
-mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep
+#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&re
 #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
+baseurl=http://ftp.sakura.ad.jp/pub/linux/centos/$releasever/os/$basearch/
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 #released updates
 [updates]
 name=CentOS-$releasever - Updates
-mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep
+#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&re
 #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
+baseurl=http://ftp.sakura.ad.jp/pub/linux/centos/$releasever/updates/$basearch/
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 #additional packages that may be useful
 [extras]
 name=CentOS-$releasever - Extras
-mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep
+#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&re
 #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
+baseurl=http://ftp.sakura.ad.jp/pub/linux/centos/$releasever/extras/$basearch/
 gpgcheck=1
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 #additional packages that extend functionality of existing packages
 [centosplus]
 name=CentOS-$releasever - Plus
-mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&rep
+#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&re
 #baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
+baseurl=http://ftp.sakura.ad.jp/pub/linux/centos/$releasever/contrib/$basearch/
 gpgcheck=1
 enabled=0
 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

パッケージを更新します。

# yum check-update
# yum -y update

リブート後、正常性を確認します。

# reboot

以上で、取り急ぎ行っておくべき初期設定は完了です。仮想マシンを再起動して正常性を確認します。