CentOS7の初期設定(Webサーバーとして使うため)

LAMP環境でアプリケーション開発するために、CentOS7の設定をしていきたいと思います。今回の要件としては、不特定多数のエンジニアが開発に関わるため、セキュアなんですが割と緩めに設定していきたいと思います。
今回やったことは、下記です。

  • SELinuxの無効化
  • リモートからメンテナンスできるユーザを追加する
  • 特定のユーザのみroot権限を与える
  • rootでのログイン禁止する
  • 鍵認証の設定+パスワードでのログイン禁止

前提として、さくらのクラウドでサーバーを追加しSSHでログインできる状態ができていることです。 今回は「石狩第2ゾーン」に追加してみました。

まずはSSHログインとチェック

ターミナルから

[localpc@]$ ssh root@{IPアドレス}

CentOSのバージョン確認

[root@adan ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 

日付とか見てみる。
以前は、日本語のパッケージをyumでインスコしていたのですが、
サーバのインスタンス立ち上げた時点でに日本語対応されてる。

[root@adan ~]# date
2017年 11月 14日 火曜日 17:34:23 JST

yum updateをかける

[root@adan ~]# yum -y update

SELinuxの無効化

rootにセキュリティが一極集中することを避けて、HTTPやFTPといったプロセスごとにアクセス権限を設定できるのですが、今回は小規模のWeb開発用なので、余計な設定は避けるために、無効にします。
、、、が既に無効になっていた。。。さくらクラウドはデフォルトでSELinuxが無効なってるってことか・・・それはそれでいいのか。
もし、有効になっている場合は、下記を参考に。
現在SELinuxが有効かどうか確認(Enforcingは有効)

[root@adan ~]# getenforce
Enforcing

SELinuxを無効にする

[root@adan ~]# setenforce 0

再度確認(Disabledになっていれば無効)

[root@adan ~]# getenforce
Disabled

/etc/selinux/config を編集して、再起動後にも無効化されるように設定。

[root@adan ~]# vi /etc/selinux/config
SELINUX=enforcing
↓
SELINUX=disabled
に変更する

SELinuxの重要性

SELinuxは、rootユーザが全ての権限を所有すると言う概念を捨て、各プロセスが必要最低限の権限を保有することで、クラッカやハッカーに侵入されてもシステムへの影響を最小限に抑えようという設計思想の元に生まれました。ですが、未だ発展途上で、「今すぐ使えるレベルなのか」「使う意味はあるのか」などの論争があるのも事実で、あまり普及していない印象が有ります。僕も無効にして使っていますが。。。僕が思うに論争以前に、SELinuxの設定が複雑で管理コストがかかってしまうのが大きな原因だと思います。実際に使っていくには各アプリケーションや各プロセスの特性を理解し、適切なポリシーを作成するというチューニングが必要になってきます。
結論としては、もっと勉強しよう!SELinuxを十分に使えるような知識をみにつけて、セキュリティの脅威に立ち向かっていくという心構えが大切なんです。

リモートからメンテナンスできるユーザを追加する

Linuxの基本的な操作になりますが、ユーザを追加したり。ユーザの所属するグループを追加していきます。

ユーザを追加
※ユーザ名「hogehoge」は各自で定義して下さい

[root@adan ~]# useradd yonaha

#ユーザのパスワード設定
[root@adan ~]# passwd yonaha
ユーザー yonaha のパスワードを変更。
新しいパスワード:

#削除する場合
[root@adan ~]# userdel -r hogehoge

ユーザ確認

[root@adan ~]# cat /etc/passwd

グループを追加する。後ほど開発者用にディレクトリの共有などを設定するのでここで作っておく

[root@adan ~]# groupadd develop

developとwheelグループに追加
※wheelグループに関しては後ほどご説明します。

[root@adan ~]# usermod -G develop,wheel yonaha

グループ確認

[root@adan ~]# cat /etc/group

ローカルのターミナルを開いてログイン出来るかチェック

[localpc@]$ ssh yonaha@{IPアドレス}

特定のユーザのみroot権限を与える(sudo設定)

Linuxでは、rootの権限を得る権利があるwheelというグループがデフォルトで備わっています。こんかは、特定のユーザのみにrootの権限を得る権利を与えていきます。

wheel グループのメンバーのみ root になれるように設定

[root@adan ~]# vi /etc/pam.d/su
以下の行のコメントを外して保存。
auth required pam_wheel.so use_uid

su コマンドで、wheel グループのみ root になれるように設定

[root@adan ~]# vi /etc/login.defs
以下の設定を追加
SU_WHEEL_ONLY yes

wheel グループのユーザーのみ sudo コマンドを実行できるように設定

[root@adan ~]# visudo
以下の行のコメントを外して保存
#%wheel ALL=(ALL) ALL
↓
%wheel ALL=(ALL) ALL

sudo 実行時にパスワード入力を求められないようにするには、
以下の行のコメントを外して保存。設定時には本当にその運用でよいか要検討。
#%wheel ALL=(ALL) NOPASSWD: ALL
↓
%wheel ALL=(ALL) NOPASSWD: ALL

これで、一応、ユーザー「yonaha」は、sudo コマンドを使うことでルートの権限を得られる状態になりました。実際にユーザー「yonaha」でサーバへログインし、sudoコマンドが使用出来るかチェックしてみましょう。

・チェック用にファイルを作ってみる
$ sudo touch text.txt
ls -laコマンド等でファイル所有者がrootになっているかチェック
-rw-r--r-- 1 root root 0 Jan 22 15:30 text.txt

・ルートユーザにスイッチで出来るか
$ sudo su - root

rootでのログイン禁止とポート変更する

sshd_configの設定

$ sudo vim /etc/ssh/sshd_config
#root での ssh ログインを禁止するように設定。
PermitRootLogin no
#鍵方式でログイン出来るようにする
PubkeyAuthentication yes
#ポートの変更もしておきましょう。
Port 58131

※49513~65535までの番号は、ダイナミック/プライベートポートと言い、基本的には、この間が自由に使えるポート番号です。

ポート変更後のfirewalldの設定変更
firewalldを使用している場合のみですが、
sshのポートを変更したら、firewalldのsshポートの設定も変更しましょう。

firewalldの設定ファイルは、「/usr/lib/firewalld/services/」以下にxml形式で、存在します。
ですが、このディレクトリは基本的にいじってはいけません。
設定を変更したい場合は、「/etc/firewalld/services/」直下に、同じファイル名で保存して上げると、設定を上書きすることが可能です。
まずは、基本設定のコピーを取ります。

[root@adan services]# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-adan.xml

コピーしたファイルを編集し、ポートを変更します。

[root@adan services]# vi /etc/firewalld/services/ssh-adan.xml

firewalld をリロードし、追加したサービス(ssh-alt)を読み込ませます

[root@adan services]# firewall-cmd --reload

サービスを追加

[root@adan services]# firewall-cmd --add-service=ssh-adan
[root@adan services]# firewall-cmd --permanent --add-service=ssh-adan

firewalldを確認する

[root@adan services]# firewall-cmd --list-all
services: ssh dhcpv6-client ssh-adan
#↑こんな感じで追加されている

sshd を再起動して設定を有効にする。

[root@adan services]# systemctl restart sshd.service

ポートを指定して何度かSSHログインを試してみる、
確認出来たら、firewalld のサービスから ssh を削除します

[localpc@]$ ssh -p 58131 yonaha@{IPアドレス}
[root@adan services]# firewall-cmd --remove-service=ssh
[root@adan services]# firewall-cmd --permanent --remove-service=ssh
[root@adan services]# firewall-cmd --reload
[root@adan services]# firewall-cmd --list-all
services: dhcpv6-client ssh-adan
#↑こんな感じでオリジナルの「ssh-adan」だけが残る

ついでに、apach用に、httpとhttpsも開けてあげる

[root@adan services]# firewall-cmd --permanent --add-service=http
[root@adan services]# firewall-cmd --permanent --add-service=https
[root@adan services]# firewall-cmd --reload
services: dhcpv6-client ssh-adan http https
#↑こんな感じで「http」「https」が追加されてるのを確認

鍵認証の設定+パスワードでのログイン禁止

今の所、鍵認証方式が一番強固な認証と言われています。秘密鍵と公開鍵からなる鍵認証方式は、公開鍵が設定されているサーバやサービスに秘密鍵を用いてログイン又は接続が可能です。いちいちパスワードを入力しなくてすむのが魅力です。(鍵自体にパスワードを掛けることもできますが。)
僕の開発環境はmacなので、下記mac用の解説です。

ローカル(ホームディレクトリ)で鍵作成

 $ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/fuga/.ssh/id_rsa): //公開鍵と秘密鍵の作成場所:Enter
Enter passphrase (empty for no passphrase): //パスワードの設定(パスワードは設定しなくてもOK):Enter
Enter same passphrase again: //パスワード再入力、今回は設定しないので:Enter。

鍵が出来たか確認

 $ ll .ssh/
-rw-------  1 junyonaha  staff   1679  2 14  2014 id_rsa      ←秘密鍵 
-rw-r--r--  1 junyonaha  staff    422  2 14  2014 id_rsa.pub  ←公開鍵

公開鍵は、基本的に人に見せてもOKです。メールで添付してもOK。ですが、名前の通り秘密鍵は秘密にして下さい、大切に紛失しないように、後、誰にも教えてはいけません。
続いて、サーバへ公開鍵の設定をしていきましょう。

(CentOS7)サーバへログイン後にホームディレクトリで「.ssh」ディレクトリを作成

$ mkdir .ssh
$ chmod 700 .ssh

(mac)ローカルPCから作成した公開鍵をサーバに送る

$ scp ./ssh/id_rsa.pub yonaha@サーバのアドレス:~/.ssh/authorized_keys

(CentOS7)受け取った公開鍵のパーミッション変更

$ chmod 600 authorized_keys

(mac)鍵方式でログイン出来るかチェック

$ ssh -i ~/.ssh/id_rsa ユーザ名@IPアドレス

(CentOS7)サーバ接続には SSH 接続のみを許可し、パスワード認証は不許可にする。

# vim /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no

(CentOS7)sshd を再起動して設定を有効にする

# sudo systemctl restart sshd.service

(mac)ローカルからログイン出来ないことチェック

# ssh -p 1234 hogehoge@{IPアドレス}

(mac)ローカルから鍵を指定してログイン出来るチェック

# ssh -p 1234 -i ~/.ssh/id_rsa hogehoge@{IPアドレス}