CentOS 7のインストール完了後に設定する例を調べてみました。
まずは実際に設定を行ってみて、ある程度理解を深めたうえで、ベストな設定を探しましょう。
OSのインストール時に、ソフトウェアグループとして「最小限のインストール」を選択した場合は、追加でソフトウェアパッケージのインストールが必要になります。
追加分についてはyumコマンド等でインストールしていきます。
一般ユーザーと管理ユーザーについて
Linuxでは2つのユーザー権限があります。
操作が限定されている一般ユーザーと、システムに対して全ての操作権限をもつ管理ユーザー(rootユーザー)です。
一般ユーザーはシステムに対して変更を行う権限を持たないため、システムの設定変更を行う場合には管理ユーザーに切り替える必要があります。
つまり、通常の操作では操作ミスによるシステム障害を防止するために一般ユーザーを利用し、システムの設定変更を行うときだけrootユーザーへ切り替える運用になります。
一般ユーザーからrootユーザーへの切り替えはsu(Super User)コマンドを利用します。(sudoコマンドを利用する方法もありますが、本記事ではsuコマンドを利用します。)
最後のハイフン部分は、切り替えるユーザーの操作環境を引き継ぐ場合に付与します。基本的には付けて実行したほうがトラブルが少ないと思います。
$ su -
suコマンドを入力すると、OSのセットアップ時に指定したrootユーザーのパスワードを入力します。パスワードが認証されるとプロンプトが「$」から「#」に変わります。
そして、切り替え後には、ディレクトリがrootユーザーのホームディレクトリになります。
ちなみに、一般ユーザーへの切り替えは「exit」とコマンドを入力します。
selinuxの無効化
selinuxはLinuxの監査やセキュリティを向上させる機能ですが、有効になっているとサービスの動作や、設定内容にかなりの制限が出てきます。そのため、基本的には無効にする場合が多い実情があります。
ウェブサイトを見ながらサーバー構築を行って思った通りに動作しない場合は、このselinuxが有効化されていることが原因だったりするので、インストール後に忘れずに無効化します。
基本的には、デフォルトで有効になっています。
selinuxが有効になっているかの確認はgetenforceコマンドで行います。
「Enforcing」と表示された場合にはselinuxが有効になっています。
$ getenforce
Enforcing
selinuxを無効にするには、viなどのテキストエディターで「/etc/selinux/config」ファイルを修正します。
# vi /etc/selinux/config
configファイルの修正点
SELINUX=enforcing のパラメータを SELINUX=disabled へ変更して保存します。
※この記載をスペルミスなどで間違えて記述してしまうと、CentOSが起動しなくなる場合があるので気を付けて下さい。
ファイルの修正後はサーバーを再起動します。
ログインして再度、getenforceコマンドでselinuxの設定状況を確認します。
実行結果としてDisabledと表示されれば、selinuxは正常に無効化されています。
$ getenforce
Disabled
bash-completion パッケージの導入
CentOS7系からはサービス管理としてsystemctlというコマンドが用意されています。
このコマンドは複数のオプションやサービスを指定する必要がありますが、デフォルトの状態だとtabキーを押した補完が利用できません。これだと不便なので、systemctlでtab補完が利用できるようにbash-completionパッケージをインストールします。
bash-completionは、CentOSのパッケージ管理用コマンドであるyumでインストールできます。
bash-completionパッケージがインストールされているかを確認するには、以下のようにyumコマンドを実行します。
# yum list installed | grep bash-completion
正常にインストールされている場合、「bash-completion.noarch 1:2.1-8.el7 @anaconda」等とコマンド結果が返ります。
パッケージをインストールするにはyum installコマンドを以下のように実行します。
# yum install bash-completion
コマンドを実行するとパッケージのインストールが開始され、結果に「完了しました!」と表示されれば、パッケージのインストールは完了します。
firewalldサービスの無効化
デフォルトで有効になっているfirewalldを無効化します。
firewalldが無効になっているかを確認するコマンドは以下になります。
enabledになっていると有効化。disabledになっていると無効化の状態です。
# systemctl list-unit-files | grep firewall
firewalld.service enabled
firewalldの無効化は以下のコマンドで行います。
# systemctl disable firewalld.service
ネットワークの設定
CentOS 7系では、ネットワーク管理をネットワークマネージャーで行います。ネットワークマネージャーはnmcliというコマンドで操作できます。
CentOS6系までのネットワーク関連ファイルを直接編集(/etc/sysconfig/network-interface/ifcfg-eth*ファイル)する方法でも設定は可能なのですが、今後はネットワーク周りの設定をnmcliで行うことが主流になると想定されますので、本記事でもnmcliを利用をします。
ホスト名の設定
CentOS のインストール時にホスト名を設定していて、そのままのホスト名で運用する場合には、本手順は不要です。
システムに対して任意のホスト名を設定します。ホスト名の設定には nmcliを以下のように実行します。(ここではホスト名の例としてxxxを設定しています。実際には環境に合わせたホスト名を指定してください)
# nmcli general hostname xxx
※nmcliコマンドのオプションは、オプションの頭文字だけでも指定が可能です。例えば、以下のコマンドでも同じオプションを指定していることになります。
# nmcli g h xxx
設定の結果は /etc/hostname ファイルを参照することで確認できます。
catコマンドで /etc/hostnameファイルを参照して、以下のように設定値である「xxx」が表示されればホスト名の確認は完了です。
# cat /etc/hostname
xxx
ネットワークインターフェイスへのIPアドレス設定
IPアドレス設定についても、OSインストール時に指定したものから変更がなければ、本手順は不要です。
インストール時のIPアドレス設定をDHCPに設定していても、固定IPに再設定することができます。
IPアドレスの設定についても、ホスト名と同じくnmcliコマンドを使用します。
nmcliコマンドの中では、「コネクション名」の指定が必要になります。
コネクション名はセットアップを行った環境によって変わりますので、先ずは以下のコマンドでコネクション名を確認します。
$ nmcli connection show
NAME UUID TYPE DEVICE
eth0 290afa05-2c4d-4a9b-b057-b8be55071d11 ethernet eth0
NAME の部分に表示されているものがコネクション名になります。上記の場合は“eth0”です。
コネクション名が分かったところで、nmcliコマンドを実行します。
IPアドレスに192.168.241.216/24、ゲートウェイとDNSサーバに192.168.241.254 を設定する場合は以下のように実行します。
# nmcli connection modify eth0 ipv4.method manual connection.autoconnect yes ipv4.addresses 192.168.241.216/24 ipv4.gateway 192.168.241.254 ipv4.dns 192.168.241.254
# nmcli connection up ens33
エラーが出力されなければ設定は変更されています。
“ip addr show”コマンドや”ip a”で、IPを表示させて設定を確認しましよう。
ipv6設定を無効にする
ipv6の無効化については任意で行います。
ipv6についての無効化は必要がない場合もあると思いますが、手順だけ記載しておきます。
viエディタで設定ファイル /etc/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/.conf file # # For more information, see sysctl.conf(5) and sysctl.d(5).
設定ファイルの一番下に、以下の二行を追加します。
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1
設定を反映するために、再起動を行い、ipv6の無効化は完了です。
firewalldでパケットフィルタの設定
CentOSはバージョン7からファイアウォールとしてfirewalldが採用されています。
firewalldはfirewall-cmdというコマンドで管理を行います。
OSの導入時に有効になっていますので、サービスの起動や、自動起動の設定は必要ありません。
firewalldで設定する内容は、以下の条件になります。
firewalldで設定するフィルタポリシー
- サーバーに入ってくるパケットは一部を除いて拒否
- icmpは全て許可する
- 許可するポートはFTP/SSH
- SSH/FTPは管理用IPアドレス(例:111.8.21.167)からのみ許可
- サーバーに転送されるパケットは全て拒否
- サーバーから外部へ送信されるパケットは全て許可
参考:CentOS 7 firewalld よく使うコマンド
https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e
現状の確認
firewalldでは、ゾーンという「条件の組み合わせ」を作成してフィルタを設定します。
ゾーンはデフォルトで予め作成されているものが、自動的にインターフェイスに対し適用されています。
適用されているゾーンとその設定を確認するには、以下のようにfirewall-cmdコマンドを実行します。
# firewall-cmd --get-default-zone
public
最初はpublicゾーンが、デフォルトで割り当てられていることが確認できます。
publicゾーンの設定を確認します。
確認にはfirewallcmdに–list-allオプションを付けてコマンドを実行します。
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
上記の出力結果で注目するポイントは”interfaces”と”services”の項目になります。
これはインターフェイスens0(CentOSがデフォルトで作成したインターフェイス名)に対して「dhcpv6-client」と「ssh」の接続を許可するという内容になります。
上記はインターフェイス全体に対して掛かる設定になりますので、ここでsshを許可している場合、どのIPからの接続でもssh接続できるという設定内容になってしまいます。
たとえば、この設定を上記で記載した内容に変更を行います。
管理用ゾーンの追加とfirewalldのIPアドレス制限
publicのゾーンはインターフェイスに割り当てられていますので、個々のサービスを異なるIPアドレスで制限することが困難です。
その為、新しいゾーンを作成して、許可するサービスと許可する接続元のIPアドレスを設定します。
新しいゾーンの作成
firewall-cmdコマンドに ”–new-zone”オプションを付けて、新しいゾーンを作成します。
ゾーン名は任意で”manage”としています。”–permanent”オプションは、設定を恒久的に行うというものになります。
このオプションが付いていない場合、firewalldサービスを再起動したときに都度、設定内容がクリアされます。
# firewall-cmd --new-zone=manage --permanent
success
設定が正常に完了すると、”success”と応答メッセージが表示されます。
※ちなみに--zone
オプションを指定することで、任意のゾーンのFW設定を確認できます。
# firewall-cmd --list-all --zone=manage
※あとは--list-all-zones
オプションを指定することですべてのゾーンのFW設定を確認できます。
# firewall-cmd --list-all-zones
ゾーンへのサービス追加
作成したゾーンに対して、通信の接続許可を設定します。
”–set-taget”オプションに”ACCEPT”を指定することで、接続許可を”manage”ゾーンに与えます。
# firewall-cmd --zone=manage --set-target=ACCEPT --permanent
successと表示されれば、設定は完了です。
続いて、ゾーンに登録するサービスを設定します。ここで設定したサービスのみ接続できるようになります。
firewall-cmdコマンドに”–add-service”オプションを付けることで、ゾーンに許可したいサービスを追加していきます。以下では、sshとftpを追加しています。
# firewall-cmd --zone=manage --add-service=ssh --permanent
success
# firewall-cmd --zone=manage --add-service=ftp --permanent
success
ちなみに登録できるサービス一覧のリストは、以下コマンドで確認できます。
追加したいサービス名が不明な場合は、このコマンドで確認して下さい。
# firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
接続元のIPアドレス追加
登録したサービスに対して、接続が可能な接続元IPアドレスを追加します。
IPアドレスの追加は”–add-source”オプションで指定します。
# firewall-cmd --zone=manage --add-source=111.8.21.167/32 --permanent
success
接続元のIPアドレス追加が完了したら、ゾーンの設定は完了です。
設定した内容を反映するためにfirewalldサービスの設定再読み込みオプションを実行します。
# firewall-cmd --reload
”Success”が表示されれば、設定の再読み込みは正常に完了しています。
設定した内容の確認を行います。
現状でアクティブになっている各ゾーンを表示します。以下のように作成した”manage”ゾーンが表示されれば、設定の確認は完了です。
# firewall-cmd --get-active-zones
public
interfaces: eth0
manage
sources: 111.8.21.167/32
publicゾーンからsshサービスの削除
続いてpublicゾーンからsshサービスを削除します。
publicゾーンにsshが入っていると、全てのIPから接続を受け付けてしまいますので、ここで削除してmanageゾーンの設定を反映します。
削除は”–remove-service”オプションにサービス名を指定して実行します。
# firewall-cmd --remove-service=ssh --zone=public --permanent
success
これでサービスの削除は完了です。以下のコマンドで、設定内容の反映を行います。
# firewall-cmd --reload
success
sshサービスがpublicゾーンから削除されていることを確認します。”–list-all”オプションを付けてfirewall-cmdを実行すると、デフォルトのゾーンについての情報が表示されます。
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
上記のようにservicesから”ssh”が消えていれば、削除の確認は完了です。
これでiptablesと同様の条件で設定が完了しました。
不要サービスの無効化
サーバーを運用する上で明らかに利用しないサービスは無効化(自動起動の停止)しておきます。
不要なポートのオープンや、サーバーリソースの無駄遣いを防ぐことを目的として行います。
本記事では停止するサービスの一例を紹介しますが、実際の環境に合わせて無効化するサービスを選択する必要があります。
サービスの無効化は systemctlを利用します。
systemctlにオプションとしてdisableを付与することでサービスを無効化できます。
例えば、以下のサービスを無効化します。
# systemctl disable auditd.service
# systemctl disable abrt-ccpp.service
# systemctl disable abrt-oops.service
# systemctl disable abrt-xorg.service
# systemctl disable abrt-vmcore.service
# systemctl disable abrtd.service
# systemctl disable libstoragemgmt.service
# systemctl disable smartd.service
# systemctl disable libvirtd.service
# systemctl disable qemu-guest-agent.service
# systemctl disable dmraid-activation.service
# systemctl disable mdmonitor.service
# systemctl disable avahi-daemon.service
# systemctl disable kdump
対象のサービスのステータスは、以下のコマンドで確認できます。
# systemctl status auditd.service
サーバーの時刻同期を設定する
サーバーはサービスを提供するという性質から、正確な時間で運用されている必要があります。
ここではサーバーの時刻を自動的に合わせるサービスであるchronydを設定していきます。
chronydサービスの設定
chronydサービスの設定は、/etc/chrony.confファイルで行います。
viエディタで設定ファイルを開きます。
# vi /etc/chrony.conf
設定ファイルは、デフォルトで時刻同期先のサーバーがいくつか記載してありますので、こちらをコメントアウトしていきます。
#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
設定ファイルのコメントアウト後、参照したい時刻同期用サーバーを同じ形で記載していきます。
ちなみに最後に記載した、iburstオプションは起動直後に同期先のサーバーに4回連続的に問い合わせを行い、時刻同期を早く行うことができるオプションになります。
本記事ではインターネット上にあるタイムサーバーである ntp2.jst.mfeed.ad.jp をタイムサーバーとして指定します。
server ntp2.jst.mfeed.ad.jp iburst
追記と編集が終わったら、ファイルを保存します。
設定を有効にするために、以下のコマンドでchronydサービスを再起動します。
# systemctl restart chronyd
時刻同期の確認
設定した内容が正常に反映、また時刻同期先のサーバーと同期が出来ていることを確認します。
確認用のコマンドは chronyc になります。このコマンドに sources オプションを指定することで
同期の状態を確認することができます。
# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
=================================================================
^* ntp2.jst.mfeed.ad.jp 2 10 377 222 -22us[ -35us] +/- 71ms
正常に同期できている場合、同期先のサーバー名に*(アスタリスク)が付きます。
*が付かない場合は以下のような原因が考えられます。設定内容や環境を確認してみて下さい。
NTPサーバーと同期できない場合のチェックリスト
- chrony.conf 設定ファイルに誤りがある
- chronydサービスの再起動が出来ていない
- サーバーがインターネットへ接続できていない
- サーバーのDNS設定が行われていないなどが原因で名前引きに問題がある
SSHサービスのセキュリティ設定
SSHはサーバーへリモートで接続するためのサービスになります。
基本的にはOSインストール直後に動作していますが、デフォルトの設定ではややセキュリティに難があります。
ここではデフォルトの設定を変更して、ssh接続のセキュリティを高める設定を紹介します。
SSHサービスには複数のセキュリティ設定(例えば鍵認証や、ポート番号の変更など)がありますので、更にセキュリティを高めたい方は調べてみて下さい。
SSHサービスはデフォルトでrootユーザーのログインを許可しています。
rootユーザーはユーザー名が既に判明しているためパスワードが判明すると、管理者権限でサーバーへログイン出来るため、今回はこれを拒否する設定を行います。
一般ユーザーの作成
CentOSのインストール時に一般ユーザーを作成している場合は、本手順は不要です。
サーバーに作成されているユーザーがrootのみの場合、SSHによるリモートログインが出来なくなります。そのため、OSのインストール時にユーザーを作成していない場合、事前にユーザーを作成する必要があります。
ユーザーの作成はuseraddコマンドで行います。
-pオプションでパスワードを指定します。
例えばユーザー名としてtest1をパスワードとして123456を設定する場合は以下となります。
# useradd -p 123456 test1
SSHサービスの設定ファイル変更
続いて、SSHサービスの設定を変更するために設定ファイルを変更します。
SSHサービスの設定ファイルは“/etc/ssh/sshd_config”になりますので、設定ファイルをエディターで開きます。
# vi /etc/ssh/sshd_config
開いた設定ファイルの35行目付近に記載がある、以下の部分を次のように変更します。
# Authentication: #LoginGraceTime 2m #PermitRootLogin yes #StrictModes yes #MaxAuthTries 6 #MaxSessions 10
上記のファイル中の # PermitRootLogin yes から、コメント部分 (#の行)を外します。
そして、yes になっている値を no へ変更します。変更後のファイルは以下のようになります。
# Authentication: #LoginGraceTime 2m PermitRootLogin no #StrictModes yes #MaxAuthTries 6 #MaxSessions 10
該当する部分の変更が完了したら、ファイルを保存します。
変更した設定を反映するためにSSHサービスの再起動を行います。
サービスの再起動はsystemctlコマンドで行います。再起動は以下のように実行します。
# systemctl restart sshd
エラーが出力しなければ、再起動は完了しています。
確認ポイントとしては、SSHクライアントでサーバーへリモート接続を行い、接続が拒否されることを確認してください。
LinuxのSSHコマンドでは以下のような結果になります。
# ssh -l root (接続先IPアドレス)
root@localhost's password:
Permission denied, please try again.
接続が拒否されたことが確認できます。
teratermでは以下のように接続を拒否されることが確認できます。
これでSSHサービスの設定は完了です。
suできるユーザーを制限する
デフォルトの状態ではsuコマンドでrootユーザーに、どのユーザーでも移行することができます。
複数のユーザーがサーバーに作成されている場合、どれか一つでもユーザーのログイン情報が分かってしまうと不正アクセス後にsuコマンドでrootユーザー権限を奪取されてしまうため、できる限りsuコマンドを実行できるユーザーを制限することをお勧めします。
suコマンドは設定を変更することで、wheelグループに属するユーザーのみに、suを実行できる権限を与えることができるようになります。本章では設定手順を紹介します。
wheelグループへのユーザー追加
事前準備として、suコマンドの実行を許可したいユーザーをwheelグループへ追加します。
wheelグループへのユーザー追加は2つあり、usermodコマンドを利用する方法と、groupファイルを直接、編集する方法の何れかがあります。
ここではusermodコマンドを利用した手順を紹介します。
まずは作成したtest1ユーザーの現状を確認します。idコマンドを使用します。
# id test1
uid=1001(test1) gid=1001(test1) groups=1001(test1)
usermodコマンドを実行してwheelグループへユーザーを追加します。追加したいユーザーがtest1という名前の場合以下のように実行します。
# usermod -g wheel test1
wheelグループへ追加されていることを確認するには、idコマンドを利用します。ユーザー名を指定して実行すると、以下のようにuidやgidの情報が表示されます。
# id test1
uid=1001(test1) gid=10(wheel) groups=10(wheel)
上記からグループがwheelグループへ変更されていることが確認できます。これでグループへの追加と確認は完了です。
suコマンドの設定ファイルを変更
続いてsuコマンドに関する設定ファイルを変更します。suコマンドの設定ファイルは /etc/pam.d/su です。このファイルをエディターで開きます。
# vi /etc/pam.d/su
設定ファイルは以下のようになります。
#%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 # 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 からコメント(#)を外します。変更後の設定ファイルは以下となります。
#%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 # Uncomment the following line to require a user to be in the "wheel" group. auth required pam_wheel.so use_uid
これでsuを実行してrootになることができるユーザーが制限されました。確認で、wheelグループ以外のユーザーでsuコマンドを実行してみます。
$ su -
パスワード:
su: 拒否されたパーミッション
このように拒否されることから、設定が正常に動作していることが確認できます。
パッケージのアップデート
メディアからインストールされたCentOSでは、含まれているパッケージがすでに古くなってしまっていることがあります。
基本的な設定が完了した時点で、システムに含まれているパッケージを全て新しいものに更新することをお勧めします。
CentOSでは全てのパッケージを更新するためにも”yum”を利用します。
更新を実行しないで、更新されるパッケージだけを確認するには以下のコマンドをまず実行します。
実行すると、以下のように更新されるパッケージの一覧が表示されます。
# yum check-update
事前にどのようなパッケージが更新されるかを確認しておくことをお勧めします。
パッケージのアップデートには”yum update”コマンドを実行します。以下のように実行します。
# yum update
コマンドを実行すると、パッケージのダウンロードが開始されます。
そのあと、ダウンロードしたパッケージの容量と更新を実行するかの確認がありますので、”y”を入力すると、パッケージのアップデートが実行されます。
最後に「完了しました!」と表示されればパッケージの更新は完了しています。カ
ーネルや重要なライブラリが更新された場合には、念のためにシステムの再起動を行っておくほうが良いかと思います。
※パッケージ更新について”y”の確認が不要でスキップしたい場合には「-y」オプションを付けます。