サーバ作成直後に設定しておくべき初期セキュリティ設定¶
このチュートリアルは、初めて CentOS 7 を利用する方を対象とし、サーバ管理者として最低限行っておくべきセキュリティ対策をご紹介します。
具体的には、安全に操作をするための一般ユーザ作成、sudo 設定、SSH サーバ設定を行います。
さらに応用として、CentOS 7 で新しく導入された firewalld を活用し、SSH 接続ポートの変更により安全性を高める方法もご紹介します。
事前準備¶
さくらの VPS で CentOS 7 を使うには¶
さくらの VPS は OS 再インストール機能を使えば、標準(CentOS 6)以外の OS をご利用できます。
CentOS 7 を使いたい場合は、「標準OSインストール」から「CentOS7 x86_64」を選びます。
CentOS 7 の OSインストール手順については、次のサポート情報をご覧ください。
標準インストールであれば、OS のデーモン設定、セキュリティ設定、時刻同期など、最低限の設定を済ませてあります。
また、OS 再インストールの「カスタム OS インストール」機能からも CentOS 7 を選べます。
ただし、カスタム OS インストールでは、OS の初期設定を全て自分で行う必要があります。
そのため、初めてのインストールの場合は「標準インストール」のご利用をお勧めします。
標準インストールの自動設定内容を知るには、次のセットアップ情報をご覧ください。
SSH 接続でサーバにログイン¶
OS のインストールが終われば、サーバには SSH でログインできます。
ログインに必要なユーザ名は「root」、パスワードは OS インストール時に指定したものを使います。
- Windows で SSH を使う場合 … OS には SSH 接続に必要なソフトウェアが入っていません。そのため、Tera Term や PuTTY など SSH 用ソフトウェアのダウンロードとセットアップが必要です。
- macOS や Linux の場合 … ターミナル(端末)上から「ssh root@<IPアドレス>」と入力し、接続できます。特別にソフトウェアのセットアップは不要です。
ログインとユーザ権限のセキュリティ¶
root によるログインや操作を許可しない方針¶
サーバにログインできたら、セキュリティを高める設定を進めていきましょう。本チュートリアルでは、安全なサーバ環境を作るために、次の基本設定を行います。
- 一般ユーザの作成
- 公開鍵認証の設定
- sudo 設定
- SSH 接続時、root でのログインを禁止
- SSH 接続時、パスワード認証を禁止
以降で詳しい手順を見ていきます。
作業用一般ユーザの作成¶
初期状態ではログイン可能なユーザは「root」のみです。root はサーバ上で全ての操作が可能な特権ユーザです。
そのため、インターネット上の SSH サーバに対する不正アクセスや攻撃対象として日々狙われています。
攻撃を受ける危険性を減らすには、root でのログインを禁止し、一般ユーザのみログインを許可する設定を行います、
一般ユーザの作成は「useradd」コマンドを使います。
例:「sakura」という名前のユーザを作成
# useradd sakura
ユーザ作成後は「passwd <ユーザ名>」コマンドでパスワードを設定します。
パスワードは8文字以上の他人から推測されにくいものを設定します。
パスワードの強度(安全度)を高めるには、アルファベット、数字、記号の組み合わせを使います。
パスワードの強度が高いかどうかは、マイクロソフト社が提供するパスワードチェッカー等でご確認いただけます。
例:ユーザ名「sakura」のパスワードを変更する場合
# passwd sakura
Changing password for user sakura.
New password: <画面にパスワードは表示されません>
Retype new password: <もう一度入力します>
passwd: all authentication tokens updated successfully.
「 successfully 」(成功)と表示されたら設定完了です。「Sorry, passwords do not match.」(パスワードが一致しない)
なお、パスワードが不適切な場合は「BAD PASSWORD」(悪いパスワード)の警告が画面に表示されます。
例:
- 「BAD PASSWORD: The password is shorter than 8 characters」…8文字以下のパスワードの場合
- 「BAD PASSWORD: The password fails the dictionary check – it is based on a dictionary word」…よく使われる語句として、辞書に登録済みの文字列が入っている場合
- 「BAD PASSWORD: The password is a palindrome」…「aaaaaaaa」のように同じ文字が連続している場合
このように警告が表示される場合は、他のパスワードをご検討ください。
設定が終われば、対象ユーザでログインできるか確認します。
SSH 接続時、ユーザ名を先ほどの「root」ではなく、作成したユーザ名に変更します。
また、パスワードを入力し、ログインできるかどうかを確認します。
コマンドラインで接続する例:
$ ssh sakura@
sakura@'s password:
SAKURA Internet [Virtual Private Server SERVICE]
[sakura@<番号> ~]$
もしログインできなければ、ユーザ名やパスワードが正しいかどうか確認します。
公開鍵認証を使ったログイン設定と確認¶
次は、作成したユーザに対して、公開鍵認証の設定を行います。
PC などのクライアント側で SSH 接続用の鍵ペア(秘密鍵 id_rsa と、公開鍵 id_rsa.pub の組み合わせ)を作成します。
作成後はパスワードではなく、クライアント側の秘密鍵を使ったログインができるように、設定を行います。
Windows の TeraTerm の場合は、以下のサポート情報をご覧ください。
Linux や macOS では ssh-keygen コマンドで鍵ペアを作成します。あるいは、既に鍵ペアを作成済みであれば、お持ちの鍵ペアを使っても構いません。
鍵ペア作成後は、公開鍵ファイル(id_rsa.pub)を scp などを使い、サーバ上の作成したユーザのホームディレクトリにアップロードします。
アップロード後は、SSH ログインした状態で、公開鍵リスト用ファイル(authorized_keys)に公開鍵を追加します。
$ cd # 確実にホームディレクトリに移動
$ mkdir .ssh # ディレクトリ作成
$ chmod 700 .ssh/ # 自分以外のアクセスを禁止
$ mv id_rsa.pub .ssh/authorized_keys # 公開鍵リスト作成
$ chmod 600 .ssh/authorized_keys # 自分以外の読み書きを禁止
あとはログアウトした後(「logout」または「exit」コマンドを入力して SSH 接続を終了)、再度ログインを試みます。
このとき、認証にはパスワードを使わず、秘密鍵を指定してログインできることを確認します。
wheel グループに対する sudo 設定の有効化¶
次に、一般ユーザで「sudo」コマンドが使えるように設定します。
sudo とは、別のユーザとしてコマンドを実行するためのコマンドであり、設定ファイル /etc/sudoers を参照し、一般ユーザでも root と同じ権限で操作可能な状態にします。
言い換えますと、sudo を使えるユーザとは、su コマンドの実行や root パスワードを知らなくても、管理者権限として必要なコマンドを実行できます。
これはセキュリティ面や誤操作の防止で役立ちます。sudo コマンドの実行時には、常にログが残ります。
また、コマンド実行時、自分のパスワードによる認証を必要とするため、root のパスワードを共有する必要がありません。
また、本当に権限が必要な場面でしか root 権限を使わないようにできます。
ここでは、先ほど作成したユーザを「wheel」グループに追加し、sudo コマンドが使えるようにします。
wheel グループとは、sudo コマンドで root 権限を実行するための、特別なグループです。
設定は、「su」コマンドで root に切り替えた後、「usermod」コマンドを使います。
# su
Password: <パスワードを入力>
# usermod -G wheel sakura # sakura ユーザを wheel グループに追加
CentOS 7 では、対象ユーザの次回ログイン以降、設定が有効になります。
実行例(id コマンドを実行すると、root ユーザ権限だと分かります):
$ sudo id
[sudo] password for sakura:
uid=0(root) gid=0(root) groups=0(root)
より安全な SSH 接続のための設定¶
これまでの設定の仕上げとして、SSH サーバの設定も変更します。
- SSH で root アカウントでのログインを許可しない
- パスワード認証を許可しない
設定を変更するには、まず、設定ファイル「/etc/ssh/sshd_config」を編集します。
その前に、バックアップ用のファイルを作成しておきます(もしも設定変更後に sshd サーバが起動できなくなっても、元の sshd_config に戻せば復旧できるからです)。
次に「sudo vi /etc/ssh/sshd_config」などで設定ファイルを開いたら、ファイル中の2ヵ所を変更します。
#PermitRootLogin yes # root でのログインを許可するかどうか
PermitRootLogin no # yes を「no」(許可しない)に
#PasswordAuthentication yes # パスワード認証を許可するかどうか
PasswordAuthentication no # yes を「no」に
ファイルを保存後、sshd を再起動して設定を有効化します。
$ sudo systemctl restart sshd
正常に稼働しているかどうかは、次のようにコマンドを実行し、sshd が「Active: active (running)」なのを確認します。
$ sudo systemctl status sshd
* sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2017-02-15 13:27:39 JST; 14s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 4955 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 5057 (sshd)
CGroup: /system.slice/sshd.service
└─5057 /usr/sbin/sshd -D
もし「dead」(停止中)となっている場合は、正常に起動していません。
原因を調べるためにはログの参照が必要です。ログは「journalctl -xe」コマンドで確認できます。
多くの場合は sshd_config の記述ミスに関するエラーが表示されているでしょう。
さくらの VPS の場合、もしログインができなくなっても、コントロールパネル上の「コンソール」機能を通して操作可能です。
動作確認では、今の SSH 画面はそのままにし、別のログイン画面を立ち上げての動作確認をお勧めです。
あとは、root でログインを試みてもエラーとなり、パスワード認証もできなければ設定完了です。
チェックリスト¶
最後にまとめとして、設定を正しく行ったかどうか、改めて動作のご確認をお願いします。
- root アカウントでログインできない
- 一般ユーザで公開鍵認証を使わないとログインできない
- sudo コマンドを実行して、root 権限としてのコマンドが実行できる
もし、root でログインできたりパスワード認証が通ったりする場合は、設定の見直しをお願いいたします。
応用:SSH 接続用ポート番号の変更¶
応用として、SSH の接続用ポート番号を変更する方法を紹介します。SSH 通信に使用するポート番号 22 (tcp) は、一般的によく知られているポート番号であり、常に攻撃対象として晒されています。
攻撃の危険性を下げる対策の1つが、SSH ポート番号の変更です。近年はこの手法も一般的になりつつあるため、必ずしも効果は保証できませんが、一定の効果は期待できるものと思います。
さて、作業は sshd_config の設定変更後、firewalld の設定を変えます。
まず、sshd_config のポートを「22」から「10022」に変更します。なお、ここでは 分かりやすくするため10022 を設定例として紹介していますが、任意のポート番号を指定すべきです。
#Port 22
Port 10022
設定を有効化するために、sshd を再起動します。
$ sudo systemctl restart sshd
次にサーバ内から自分自身(localhost)のポート 10022 が応答するかどうかを確認します。
もし、ポートの応答がなければ(「Connection timed out」などのエラー)、ポートが正常に開いていませんので、設定の見直しが必要です。
$ ssh root@localhost -p 10022
The authenticity of host '[localhost]:10022 ([::1]:10022)' can't be established.
ECDSA key fingerprint is 75:69:50:2a:2d:ce:d1:87:b8:21:7d:4f:c2:9d:e9:bf.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:10022' (ECDSA) to the list of known hosts.
Permission denied (publickey).
なお、この例では接続時に SSH 接続の継続確認で「yes」を選択しても、root での認証が通らずにエラーになります(Permission denied)。
しかし、こちらは先ほど認証時の設定を変更しているため、root でログインができなくても正しい挙動です。
また、一般ユーザのログインを試みても、サーバ上には接続元としての鍵ペア(の秘密鍵)がなく、パスワード認証も無効にしているため、接続できません。
SSH の次は、 firewalld の設定ファイルを編集します。コマンドを実行して設定ファイルを開きます。
$ sudo vi /usr/lib/firewalld/services/ssh.xml
ファイルを開いたら「port=”22″」の部分を「port=”10022″」など、任意のポート番号に変更します。
SSH |br|
Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. |br|
It provides secure encrypted communications. |br|
If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. |br|
You need the openssh-server package installed for this option to be useful.
設定後、次のコマンドを実行して設定を有効にします。
# sudo firewall-cmd --reload
success
あとは、リモートからポート番号を指定して、接続が可能であれば設定は正常です。
以下は、 sakura ユーザで、ポート 10022 に接続する例です。
$ ssh sakura@ -p 10022
SAKURA Internet [Virtual Private Server SERVICE]
[sakura@<ホスト名> ~]$
このように正常にログインできれば問題ありません。