Linux初めて触る人がCentOS7でVPSのセキュリティ設定したときのメモ


導入

サーバ系の知識が皆無に等しい状態からCentOS7でVPSのセキュリティ設定をしたので、アウトプットとして残しておきます。
CentOS7はCentOS6と違う設定方法を使ったりするんですが、Webの情報が入り混じっていて苦労したので、CentOS7に絞って書きます。
作業の目的や意味もなるべく初心者向けに分かりやすく記述しますが、当方も初心者なので意図せず誤った情報が混入する蓋然性についてご承知くださいませ(. _ .)

■環境
VPS:KAGOYACLOUD KVM
OS:CentOS7
SSH接続ソフト:TeraTerm

■前提条件
TeraTermを使ってroot権限でサーバにSSH接続できていること。
ここまでの設定はKAGOYA CLOUDのマニュアルを参照。

やることは主に以下の2つに分かれています。

・root権限の保護
・ファイアウォールの設定

それぞれに分けて説明します。
なお、注意ですが、ここで行う作業でミスをすると自分で設定したセキュリティのせいで自分がサーバにアクセスできなくなるという悲劇を生みかねませんので、くれぐれも慎重に。

root権限の保護

rootユーザというのは、システムに対してあらゆる権限の実行を認められた特別なユーザのことです。
しかし、その権限の強大さ故に、悪意ある第三者にroot権限を乗っ取られると、サーバで好き放題されて大変なことになってしまいます。
そこで、root権限を厳重に保護する設定を行います。

基本方針は以下の通りです。

・rootユーザでのログインを禁止
・root権限が必要なときは作業用(一般)ユーザがrootユーザとして一時的に権限を行使する(sudoといいます)
・sudoでroot権限を実行できるユーザがサーバにログインするときには公開鍵認証を用いる

※KAGOYACLOUDでは初期設定でrootへのログインに公開鍵認証を用いるようになっているので、ここまでこだわらなくても良いのかもしれませんが、一応。

ここでのステップは以下の通りです。

・rootユーザのパスワード設定
・作業用ユーザの追加
・作業用ユーザがsudoを実行できるようにする
・作業用ユーザのログインに公開鍵認証を設定する
・rootユーザでのログインを禁止

それでは始めていきましょう!

rootユーザのパスワード設定

# passwd root

上述のコマンドでrootユーザのパスワードを設定できます。
認証のため2回入力を促されます。
なお、パスワードの入力中はTeraTermのコンソール画面には何も表示されませんが、入力はできています。

作業用ユーザの追加

# useradd (任意の名前)

rootの代わりにログインに用いる一般ユーザを追加します。
追加したら、このユーザについても# passwd (任意の名前)でパスワードを設定しましょう。

設定が完了したら、試しにrootユーザと追加したユーザで何度かログインを切り替えて、設定が正しく反映されているかチェックします。

# su - (追加したユーザ名)

su - (ユーザ名)でログインを切り替えることができます。
rootユーザから一般ユーザへの切り替え時にはパスワードを求められませんが、一般ユーザからrootユーザにログインするときにはパスワードの入力を求められます。
ちなみに、rootユーザのときはコンソールのカーソル位置に「#」が表示されますが、一般ユーザのときは「$」が表示されています。

作業用ユーザがsudoを実行できるようにする

sudoは、一般ユーザがroot権限で操作を実行するためのコマンドです。
しかし、追加した作業用ユーザはこのままではsudoを実行する権限がありませんので、権限を付与してあげましょう。

権限を付与するには、コンソール画面からテキストファイルを編集する必要があります。
以下のコマンドでテキストファイルを開きましょう。
※viはテキストファイルを編集するコマンドです。よく使うので覚えましょう。

# visudo

実行すると、テキストがずらっと現れます。
そのまま下にスクロールしていくと、以下のような箇所があります。

## Allows people in group wheel to run all commands
# %wheel  ALL=(ALL)       ALL

"#"はコメントアウトの意味です。
iキーでテキストファイルを編集状態にして、これを削除します。

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

削除したら、Escキーで編集状態を抜け、「:wq」と入力することで変更を保存します。
ちなみに、「w」が変更を保存するコマンドで「q」がファイルを閉じるコマンドなので、もし変にいじってしまったときは「:q」で変更を保存せずにファイルを閉じることができます。

これで「wheel」というグループに含まれているユーザがsudoを使えるようになりました。
あとは、作成した作業用ユーザをwheelグループに追加してやります。

# usermod -aG wheel (追加したユーザ)

ここまでできたら、追加したユーザに切り替えて自分の所属グループを確認してみましょう。

$ groups

これで「wheel」の表示が出れば成功です。
sudoコマンドが使えるか試してみましょう。

$ sudo su - 

作業用ユーザのパスワードを入力してrootになることができればsudoが使えるようになっています。

作業用ユーザのログインに公開鍵認証を設定する

公開鍵認証とは、公開鍵と秘密鍵を用いた認証システムのことです。
詳細は公開鍵暗号などで検索すると良いかと思いますが、単純なパスワードを用いた認証よりもセキュリティを強固にすることができます。
サーバ側に公開鍵を置いておいて、ログインする際にクライアントが持っている秘密鍵で照合します。
また、秘密鍵にパスフレーズ(使用する際のパスワードみたいなもの)を設定しておくことで、万が一秘密鍵が第三者の手に渡った場合でも簡単に秘密鍵を使用できないようにします。
無論ですが、秘密鍵は絶対に外に漏らしてはいけません。

ここでの作業は以下の通りです。

・作業用ユーザ用の公開鍵と秘密鍵を生成する
・サーバに公開鍵を設置する

作業用ユーザ用の公開鍵と秘密鍵を生成する

この箇所に関しては、他に詳しく解説しているものがあるのでそちらを参照してください。
TereTermで鍵を生成することができます。
SSH接続の設定変更方法

サーバに公開鍵を設置する

公開鍵と秘密鍵を生成して、自分のPCにふたつの鍵がある状態からスタートします。
まず、サーバに公開鍵を送ります。
TereTermのコンソール画面に公開鍵をドラッグ&ドロップすることでファイルをサーバに送信することができます。

ここからLinuxのディレクトリ構成についても少し理解が必要になってきます。
自分で体験するのが一番だと思うので、役に立ちそうなコマンドを載せておきます。

コマンド    説明       
pwd カレントディレクトリを確認する
ls -al カレントディレクトリ内の詳細表示
cd ディレクトリを移動
mv ファイルを移動
cp ファイルをコピー
rm ファイルを削除

cdを使ってディレクトリを色々見てみるのが良いと思います。

さて、サーバに送信された公開鍵を指定の位置に移しましょう。
送信された公開鍵は
\root\id_rsa.pub
にあります(もしかすると別の場所にあるかも)。

これを
\home\(追加したユーザ名)\.ssh
のディレクトリに移動させます。

まず\home\(追加したユーザ名)に移動して、このディレクトリに.sshという名前のディレクトリがあるかを確認します(上で紹介しているコマンドを組み合わせてがんばってください)。
ない場合はこのディレクトリで

# mkdir .ssh

を実行して.sshディレクトリを作成してください。
そして、以下のコマンドを実行してファイルを.sshへ移動させます。

# mv \root\id_rsa.pub \home\(追加したユーザ名)\.ssh\authorized_keys

おそらくこれで一気に動くはずですが、不安だったらディレクトリを少しずつ辿って動かしていっても良いです。

なお、送信したid_rsa.pubの内容は最終的にauthorized_keysという名前のファイルに書き込まれている必要があります。
上のコマンドではid_rsa.pubを移動させるついでにauthorized_keysにリネームしてしまっています。
.sshディレクトリで次のコマンドを実行して、authorized_keysの中身が送信したid_rsa.pubと同じであることを確認してください。

# cat authorized_keys

最後に、/home/(追加したユーザ名)のディレクトリで以下のコマンドを実行し、authorized_keysと.sshのパーミッション(アクセス制限のようなもの)を変更します。

# chmod 600 .ssh/authorized_keys
# chmod 700 .ssh

詳しい説明はchmodで検索すれば良いと思いますが、600とか700といった数字は、読込・書込・実行の3つの権限を3つのグループに対して設定しているものです。
パーミッションはls -alコマンドで確認できます。

drwx------  2 root root  xx xxx xx xx:xx .ssh

これも詳しい説明は省きますが、この最初の文字列が以下のようになっていればOKです。
authorized_keys:-rw-------
.ssh:drwx------
設定が終了したら、作業用ユーザで作成した秘密鍵とパスフレーズを使ってログインできるか試してみましょう。

rootユーザでのログイン禁止

※この作業は必ず↑の手順でroot以外のユーザがログインできる状態になっていることを確認してから実行してください。

ここでの設定は以下の2つです。

・rootユーザでのログインを禁止
・パスワード認証を無効化

上の手順で追加した作業用ユーザがsudoコマンドでroot権限を使えるようになっているので、rootでのログインを封じてしまいます。
さらに、作業用ユーザは公開鍵認証でログインするようになっているので、パスワード認証でのログインを封じます。

以下のコマンドでテキストファイルを開きます。

# vi /etc/ssh/sshd_config

以下のような記述を探します。

#PermitRootLogin yes 

PasswordAuthentication yes 

ちなみに、KAGOYACLOUDでは最初からrootログインに公開鍵認証を用いるため、初期設定で以下のようになっていました。

PermitRootLogin without-password 

PasswordAuthentication no

パスワード認証を無効化し、パスワード認証以外についてrootログインを許可するという意味です。
これを

PermitRootLogin no 

PasswordAuthentication no 

こう書き換えたうえで、以下のコマンドで設定を反映させます。

# systemctl restart sshd

これで設定は完了ですが、この接続を切断する前に必ず、別の画面を開いて作業用ユーザからログインできることを確認してください。
作業用ユーザでログインでき、かつrootでのログインができなくなっていれば作業完了です。

ファイアウォールの設定

ファイアウォールについては、Webで検索すると「iptablesをいじれ」との記述が目につきますが、これはCentOS6までの話です。
CentOS7ではiptablesの後継となる「firewalld」を使ってファイアウォールの設定をしていきます。

一言でいえば、firewalldはiptablesよりも簡単にファイアウォールの機能を設定することができるコマンドです。
これを使って、使わないサービスを遮断したり、不要なポートを閉じたりしていきます。

ファイアウォールの起動

まずはfirewalldの状態を確認しましょう。

# systemctl status firewalld

おそらく初期状態では起動していないので、次のコマンドで起動させ、ついでに自動で起動するように設定しておきます。

# systemctl start firewalld
# systemctl enable firewalld

ゾーンの設定

firewalldにはゾーンという概念があります。
簡単に言えば、ゾーンはファイアウォールの強度を設定するテンプレートのようなもので、初期状態でもいくつかのテンプレートが用意されています。

現在のゾーンとデフォルトで割り当てられているゾーンを確認しましょう。

# firewall-cmd --get-active-zones
# firewall-cmd --get-default-zone

「public」と表示されれれば、そのままで大丈夫です。
次に、ゾーンの設定の中身を確認します。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

「services: ssh dhcpv6-client」という部分が、外部からの通信を許容しているサービスを表しています。
デフォルトではsshとdhcv6-cliantが許可されています。
サーバの用途に応じて、次のコマンドでサービス(例としてhttps)を追加することができます。

# firewall-cmd --add-service=https --zone=public --permanent

ssh接続のポート番号を変更

ssh接続のポート番号を変更します。初期設定では22番ポートを使用することになっていますが、デフォルトのままだと22番ポートを指定した攻撃を受けてしまいます。

ファイアウォール側の設定とssh側の設定が必要ですが、まずファイアウォールの設定から行います。
以下のコマンドでテキストファイルを開きます。

# vi /etc/firewalld/services/ssh.xml

以下のような記述があります。

 <port protocol="tcp" port="22"/>

これに追記して、

 <port protocol="tcp" port="22"/>
 <port protocol="tcp" port="2222"/>

このようにします。
なお、2222はただのサンプルなので、お好きな数字に変更してください。
22番ポートと2222番ポートを許可するという意味です。

最終的には <port protocol="tcp" port="22"/>の部分は消してしまいますが、新しいポートでの接続を確立するまでは保険として残しておいたほうが無難でしょう。
最悪、サーバにアクセスできなくなります。

さて、これだけではまだ新しいポートで接続できません。
以下のコマンドでテキストファイルを開きます。

# vi /etc/ssh/sshd_config

以下のような記述を探します。

#Port 22 

これを

Port 2222 

このように変更します。
無論、2222は上で設定したポート番号です。

ここまで設定したら、sshdとfirewalldの設定内容を反映させます。

# firewall-cmd --reload
# systemctl restart sshd

これで22番ポートが使えなくなり、新しいポートで接続できるはずですので、試してみましょう。

注意!!
新しいポート番号で接続できることが確認できるまで、絶対に現在の接続を切らないでください。
もし設定ミスで新しいポートが使えなかった場合、既に22番ポートも接続を遮断されているので、ログインできなくなります。

別のウィンドウを開き、新しいポートで接続できること・22番ポートが使えないことを確認したら作業完了です。
先に設定したファイルを開いて、不要な22番ポートの記述を削除しておきましょう。

# vi /etc/firewalld/services/ssh.xml

以上でセキュリティ設定は完了です。
お疲れ様でした。

参考文献

kagoya(カゴヤ)VPSのセキュリティ設定
SSH接続の設定変更方法
CentOS 7 firewalld よく使うコマンド
chmod? chown? よくわからんって人のための、ファイル権限系まとめ
CentOS7でSSHのポート番号を変更する