SSH で root のみパスワード認証を禁止する

本来なら SSH での root でログインを禁止したいところですが、ServersMan@VPSでは SSH 以外でのログイン手段が無いので、root ユーザのみ公開鍵認証だけは通して、パスワード認証は無効にする設定を行うことにしました。

一般ユーザはパスワード認証を許可します。

参考にしたのは以下のページ。

sshd_config の PermitRootLogin に without-password を設定するとパスワード認証以外でのみログインできるようになるらしいです。

/etc/ssh/sshd_config の以下の項目を変更しました。

PermitRootLogin without-password
PubkeyAuthentication yes

以下の設定はデフォルトで有効なので設定ファイルを変更していなければそのままで OK でした。

PasswordAuthentication yes
UsePAM yes

設定を変更したら sshd を再起動

# service sshd restart

別のターミナルから root でパスワード認証の場合はログインできないことを確認します。

ここで注意。確認は別のターミナルで行ってください。最悪 root だけでなく他のユーザでもログインできなくなる可能性もあるので、確認が取れるまではログインしているセッションを 1 つは残しておいたほうが安全です。

ちなみに、ajaxterm も ssh 経由で接続しているため、この設定を行うと ajaxterm 経由での root ログインも不可になります。


ServersMans@VPS で ssh のポートを変更する

ServersMan@VPS ではアタックを減らすために、デフォルトで SSH のポートを 22 から変更しています。

ただ全 VPS で共通のため、ServersMan@VPS を使っているとわかってしまえばポート番号もわかってしまうので、念の為ポート番号を変更しておきます。

まずは sshd の設定を変更します。ここでは例として 1234 に変更することします。

/etc/ssh/sshd_config の Port を変更します。

Port 1234

変更できたら sshd を再起動します。

# service sshd restart

別のターミナルから新しいポートに ssh で接続して、ログインできることを確認しておきます。

つづいて airdisplay (ajaxterm) の変更です。 ajaxterm も内部で ssh 接続しているので、こいつも合わせて変更しないと ajaxterm からのログインができなくなってしまいます。

変更するのはスクリプト本体です。(えっ!?)

/usr/local/share/ajaxterm/ajaxterm.py の 403 行目付近の -p オプションの数字を変更します。

    cmd=['ssh']
    cmd+=['-p1234']
    cmd+=['-oPreferredAuthentications=keyboard-interactive,password']
    cmd+=['-oNoHostAuthenticationForLocalhost=yes']
    cmd+=['-oLogLevel=FATAL']
    cmd+=['-F/dev/null','-l',login,'localhost']

設定ファイルじゃなくてハードコーディングなんですねぇ・・。

変更したら ajaxterm を再起動します。

# service ajaxterm restart

これでブラウザからログイン出来れば変更完了です。


オレオレ証明書を使って https を有効化

前回のエントリで既に SSL 前提の投稿にしてしまいましたが、それ以前に SSL を有効にしないといけないですね。

以前は金を払って証明書を発行してもらうのが普通でしたが、最近では無料で証明書を発行してくれる StartSSL というサービスもあるようです。いずれ試してみたいと思いますが、今回は個人で使うだけですし、経路を暗号化するだけが目的なので自己署名証明書(オレオレ証明書)を作成します。

ServersMan@VPS 上で作業しました。 OS は CentOS 6.5 32bit です。

秘密鍵の作成

まず秘密鍵を作ります。

# cd /etc/pki/tls/certs/
# make localhost.key

ここでパスワードを聞かれるので入力します。

続いてパスワード無しの秘密鍵を作ります。

# openssl rsa -in localhost.key -out localhost.key

上で入力したパスワードを入力します。 生成される localhost.key が秘密鍵です。

証明書署名要求の作成

次に証明書署名要求 (CSR) を作成します。

# make localhost.csr
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key localhost.key -out localhost.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:domain.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

証明書の項目を聞かれます。オレオレ証明書なので Country Name と Common Name だけ入力し、それ以外はデフォルト値(Enterのみ)で問題ありません。

証明書の作成

CSR を元に証明書を作成します。

# openssl x509 -in localhost.csr -out localhost.pem -req -signkey localhost.key -days 365

days に有効日数を入れます。上記例では 1 年間有効になります。

作成された localhost.pem が証明書になります。

ここまでで秘密鍵 (.key) と証明書 (.pem) の作成が完了です。

apache に秘密鍵と証明書を登録する

/etc/httpd/conf.d/ssl.conf の以下の設定をコメントアウトし、作成した秘密鍵と証明書を指定します。

SSLCertificateFile /etc/pki/tls/certs/localhost.pem
SSLCertificateKeyFile /etc/pki/tls/certs/localhost.key

apache を再起動します。

# service httpd restart

https://ホスト名/ でアクセスできれば OK です。
オレオレ証明書なのでブラウザにセキュリティの警告が表示されますが、経路は暗号化されており使用に問題はありません。