はい、あります。サーバーを構築する前に、初期設定として、最低限やっておいた方が良い作業をまとめたいと思います。
目次
前提条件
CentOS8の環境があること
-
CentOS8インストール手順
続きを見る
一般ユーザーとrootユーザーについて
一般ユーザーの場合、Linuxコマンドで実行できないものがたくさんあります。
viで編集すら出来ません。
実行するには、root権限が必要です。
なので、「rootユーザーに切り替えて、実行するか、sudoコマンドで実行するか」の2択に分かれます。
rootユーザーを切り替えて、作業を行うことは、意図しないコマンドや操作があった場合、取り返しが付かない状態になります。
なので、通常は、sudo権限を一般ユーザーに与えておき、sudoコマンドで実行していくのが好ましいです。
この辺りは、各組織のポリシーによるので、なんともいえませんが、こうした考え方があることは知っておきましょう。
一般ユーザーとrootユーザーの記号の違い
Linuxを扱っていく上で、基本中の基本、一般ユーザーとrootユーザーの記号の違いを、まず覚えましょう。
- 一般ユーザー 「$」で表現される
- rootユーザー 「#」で表現される
コマンドプロンプトの部分です。
command
[root@CentOS8 ~]# ←コレ
rootユーザーの切り替え
一般ユーザーでログインした後、rootユーザーに切り替えるコマンドです。
command
$ su -
su(super user)コマンドの後ろのハイフンは、「ディレクトリ属性も含めて、rootユーザーとして切り替える」という意味です。
特に理由がない限り、ハイフンを含めておきしょう。※変な所で躓かなくて済みます。
元のユーザーに戻る
rootユーザーから、元のユーザーに戻るには、「exit」コマンドを使用します。
command
$ exit
また、作業終了時にも、exitコマンドを使ってログアウトします。
yum(dnf)パッケージアップデート
Linuxを触ったことがある人は、お馴染みの、yumコマンドです。
CentOS8から、yumは非推奨になり、dnfコマンドが推奨されるようになりました。変わりますねー・・
背景としては、yumがpython2系であり、dnfがpython3系ということもあって、古くなっているんですね。
なので、移行が必要だということらしいです。ほぼ、同じ様に使える感じなので、どうせなら「dnfコマンド」で、実行してみます。
アップデートがあるか、チェック
dnfでパッケージの更新があるか確認します。オプションはyumと同じです。
command
# dnf check-update
パッケージリストが表示されれば、アップデートが可能ということです。
アップデートを実施します。
command
# dnf -y update
-y オプションは、「yes」 の略で、「実行確認を飛ばして、アップデートを行う」という意味です。
確認した後に実行したい場合は、-yをいれずに実行する形でも良いです。
パッケージのアップデートは、脆弱性の修正であったり、セキュリティ面でも最新にしておく必要があります。
初期設定時には、必ず実施しておくようにしましょう。
selinuxの無効化
selinuxは、セキュリティ向上のためのサービスですが、サーバー構築時に上手く動作しなかったり、人を躓かせることに長けているので、無効化しておきます。
昔に、selinuxのせいでサービスが起動せず、四苦八苦した苦い思い出があります。やっつけておきましょう。
selinuxが有効になっているか確認
command
# getenforce
Enforcing
「Enforcing」は有効という意味です。
無効にするために、ファイルを編集します。
command
# vi /etc/selinux/config
config
前: SELINUX=enforcing
後: SELINUX=disabled
「disabled」に変更してください。スペルミスがないよう気を付けてください。
変更した後は、有効にするために、OSを再起動します。
command
# reboot
再起動後、再度SSH接続をしてください。
selinuxが無効になったか確認します。
command
# getenforce
Disabled
「Disabled」になっていればOKです。
ネットワークの設定
CentOS8のインストール時に、IPアドレスをDHCPで取得するようにしていました。
開発環境でサーバーを利用する場合、何かのタイミングでIPアドレスの割り当てが変更されると、いちいちIPアドレスを調べる必要があるので面倒です。
サーバーのIPアドレスを固定にします。
ネットワークを設定する
ネットワークを設定する際に、コネクション名の指定が必要なので、現在のコネクション名を確認します。
ここは、各環境で違いますので、要注意です。
・コネクション名を確認する
command
# nmcli connection show
NAME UUID TYPE DEVICE
enp0s3 各環境のUUID ethernet enp0s3
NAMEの部分が、コネクション名になります。僕の環境の場合、「enp0s3」でした。
以下、設定する、ネットワーク情報です。
- IPアドレス: 192.168.1.250
- サブネットマスク: 255.255.255.0
- DNSサーバーとゲートウェイ: 192.168.1.1
僕は、サーバーのIPについては最後の数字あたりに設定するようにしています。
任意ですので、好きにしてもらってかまいませんが、自分がわかりやすいことが鉄則です。
以下、ネットワーク設定コマンドです。
command
# nmcli connection modify enp0s3 ipv4.method manual connection.autoconnect yes ipv4.addresses 192.168.1.250/24 ipv4.gateway 192.168.1.1 ipv4.dns 192.168.1.1
変更を加えた後、有効にします。
command
# nmcli connection up enp0s3
IPアドレスが変更されるので、SSH接続が切れます。再度ログインしてください。
IPアドレスを確認します。
command
# ip addr
enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:9c:40:11 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.250/24 brd 192.168.1.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 240d:1a:7a8:2100:d66c:621:69b:c89b/64 scope global dynamic noprefixroute
inetの部分が変更されているのが確認できました。
これで、固定IPになりました。WEBサーバーを立てた際などに、常に設定したIPアドレスでアクセスできるということになります。
不要サービスの無効化
不要なサービスを停止しておくことで、無駄なリソースを消費せずに済みます。
また、セキュリティ面でも有効なので、使わないものは停止しておきます。
最小構成でインストールしていたので、今回は、一つのサービスだけを停止します。
不要なサービス
・auditd ➡ ログ監査サービス
必要であると判断した場合は、無効にする必要はありません。
今回の用途は必要ないと判断したので無効にしたいと思います。
command
# systemctl disable auditd.service
自動起動のサービス一覧を表示
command
# systemctl list-unit-files
auditd.service disabled
disabledが確認できればOKです。
※qキーでエスケープします。
初期設定時に、不要サービスの停止は作業項目に入れておくべきなので、今回は一つだけでしたが、取り上げてみました。
ログインユーザー作成
初期状態では、rootユーザーのみなので、ルート以外の一般ユーザーを作成し、rootユーザーのsshログインは禁止にしたいと思います。
※インストール時にユーザー作成している場合は必要ないです。
ユーザーを追加します。
command
# useradd -p {パスワードを入力} testuser
useradd -pオプションでパスワードを設定します。波括弧は任意に変化という意味で付けているだけなので、入力はいりません。
好きなパスワードを設定してください。また、ユーザー名も自由に決めてください。
ユーザーを追加したら、無事に追加できたか確認します。
command
# cat /etc/passwd
testuser:x:1000:1000::/home/testuser:/bin/bash
上記のように追加したユーザーが表示されていればOKです。
suコマンドの制限
デフォルトでは、一般ユーザー全てに対して、suコマンドが許可されている状態です。
ということは、誰かがログインできれば、rootユーザーになり得ることができるということで、セキュリティ的によろしくありません。
rootユーザーになれる人を限定するために、wheelグループに所属させて、root制限をかけます。
対象ユーザーをwheelグループに所属させます。
command
# usermod -g wheel testuser
wheelグループに所属したか確認します。
command
# id testuser
uid=1000(testuser) gid=10(wheel) groups=10(wheel)
gidとgroupsが「wheel」になっていればOKです。
suコマンド設定ファイルを変更します。
command
# vi /etc/pam.d/su
config
前: #auth required pam_wheel.so use_uid
後: auth required pam_wheel.so use_uid
#を削除して、有効にします。
:wqで、保存終了します。
これで、wheelグループ以外のユーザーでsuコマンドを実行しても、
command
su: 拒否されたパーミッション
というように表示され、rootユーザーになることを禁止できます。
複数人に対し、ユーザーアカウントを管理する場合に、有効ですので、覚えておきましょう。
SSH設定
SSHの設定をする前に、一度ログアウトし、追加したユーザーで、SSH接続できるか試してみましょう。※ここは、自分で考えて実行してみてください。
もし、ユーザーパスワードが上手く設定できていなかったりした場合は、ルートユーザーの状態で、
command
# passwd ユーザー名
を実行することで、強制的にパスワードを変更することができます。
SSHサーバーのデフォルトの設定は、rootのログインを許可しています。
これでは、ログインを突破された場合に、サーバーを好き放題にされてしまうので、rootログインは禁止にします。
ssh設定ファイルを編集します。
command
# vi /etc/ssh/sshd_config
config
前: PermitRootLogin yes
後: PermitRootLogin no
PermitRootLoginを「no」に変更してください。
:wq で、保存終了します。
コンフィグテスト
sshdのconfigを編集した際に、テストをしておくことで、構文がエラーになって、サービスが停止してしまうと、一生ログインできません。
以下、ツイートしました。
開発環境だとしても、リモート接続をrootユーザーでログインするのは人の部屋を土足で入るようなもの。
— ふわふわしょうちゃん@主夫WEBエンジニア兼ブロガー (@FuwaFuwaShoChan) November 20, 2020
サーバー初期設定時にconfigでrootユーザーのログインは禁止にしておきましょ。
でも、設定間違えると、SSHログイン一生できないw
なので、configテストして気をつけましょーね😊
必ず、sshdの設定をした場合は、テストしましょう。
command
# sshd -t
何も出力されなければOKです。
サービスを再起動します。
command
# systemctl restart sshd
サービスのステータスを確認します。
command
# systemctl status sshd
active (running)が確認できればOKです。
一度、ログアウトし、rootログインで拒否されるか確認してみましょう。
rootでのログインが拒否されました。
ひとまず、安心。ということにしておきましょう。
タイムゾーンなどの日付確認
最後に、サーバー時刻が日本時間にあっているか、確認しておきましょう。
CentOS8インストール時にNTPサーバーなどを設定できていれば、確認だけで済みます。
日付確認
command
# date
2020年 11月 25日 水曜日 13:42:45 JST
現在の時刻と同じならOKです。
タイムゾーン確認
command
# timedatectl status
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: active
上記の3つの項目のようになっていればOKです。
NTPサーバー確認
command
# chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
==================================================================
^* ntp1.jst.mfeed.ad.jp 2 8 377 231 +104us[ +90us] +/- 45ms
^+ ntp2.jst.mfeed.ad.jp 2 8 377 162 +296us[ +296us] +/- 56ms
^+ ntp3.jst.mfeed.ad.jp 2 8 377 162 +388us[ +388us] +/- 77ms
インストール時に設定したものが、反映されていることが確認できればOKです。
まとめ
- サーバー構築はなるべくセキュリティ面を高くする
- 無駄なリソースを消費しない。最小構成を意識する
サーバー初期設定は、CentOS8だけでなく、AmazonLinux2などにも、適用できます。考え方は同じなので、もし、違うやり方だったとしても、ググれば、すぐに対応できるはずです。
まだ、細かく設定すべき項目はありますが、最低限としては、これぐらいだろうという認識です。
不意なセキュリティホールから第三者の攻撃をされないように、しっかりと機密情報を守っていけるようにしましょう。
では、今回はこの辺でー。