公開日: 2012年8月9日 09:30:45
最終更新: 2012年9月22日 13:33:37

SSH ログイン制御

ssh リモートログイン設定

SSH は Linux を遠隔地から安全に操作するためのリモートログインシェルです。これまで一般的に使われてきた Telnet とは違い、通信の内容が暗号化されるため、安全性が高いと言われています。

しかし、いくら安全性が高いと言っても、外部からの接続を許可していれば、さまざまなお国柄の人々から思いつく限りのユーザ名とパスワードでご挨拶をいただくことは必至です。例えば「lastb」というコマンドを使うと、ログインに失敗したアクセス履歴を見ることができます。

ポートを塞いで外部からの接続を拒否することが一番の安全ではあるのですが、外出中にいろいろあって、大至急の設定修正をしなきゃいけないとか、ごにょごにょ…な時もあるでしょうから、せめて自分だけはリモートログインできるようにしたいわけです。

サービスレベルでの制御 (TCP Wrapper)

hosts.allow、hosts.deny を使用して、サービスごとに許可/拒否するネットワークを設定することができます。サービスの一覧については、 /etc/services で確認することができます。例えば、次の例では以下のホストからの ssh 接続を許可します。

※ 編集を終えた瞬間にフィルタが有効になります。リモート操作は行わないほうが無難です。(泣

  • 127.0.0.1 – 自分自身 (localhost) からの ssh 接続
  • 192.168.0. – 192.168.0.1 ~ 192.168.0.254 のアドレスを持つホスト
  • .tkyo.nt.ftth.ppp.infoweb.ne.jp – 関東で B フレッツで ISP が nifty のホスト
# /etc/hosts.allow
#

# ssh サービスに対して以下のネットワークからのみ許可する。
sshd: 127.0.0.1	192.168.0.		.tkyo.nt.ftth.ppp.infoweb.ne.jp

ssh 接続を拒否するホストについていちいち列挙しているときりがありません。/etc/hosts.deny には「ALL」を指定します。

# hosts.deny

#
# ssh に対する接続は基本的に拒否する。
sshd:   ALL

固定 IP アドレスや、ごく狭いアドレス範囲であれば、TCP Wrapper の効果が期待できます。ただし、接続できる範囲を狭めただけで同じ ISP や同一ネットワークからのアタックは許すことになってしまいます。

su できるユーザを制限

ssh でログインした後、su コマンドでスーパーユーザ (root) になることができれば、システムの関わる設定や変更などを行うことができてしまいます。サーバの管理を行うメンテナンスユーザ以外は root になれないよう制限をかけます。

メンテナンスユーザ croel を wheel (管理者グループ) に登録します。

PAM 認証デーモンで root になれるユーザを wheel グループに限定します。設定ファイルは /etc/pam.d/su です。

#%PAM-1.0

# auth            required        pam_wheel.so use_uid
↓
auth            required        pam_wheel.so use_uid # コメントを外す

また、root で直接ログインしてしまえば上記の設定は無意味になってしまいますので、root ログインを規制します。設定は /etc/ssh/sshd_conf で行います。

# PermitRootLogin	yes
↓
PermitRootLogin	no    # root で直接ログインをさせない

sshd を再起動します。

RSAキーによる公開鍵認証

そもそもパスワードさえわかってしまえばログインできてしまうことがいけないので、パスワード認証でのログインをできなくしてしまいます。ssh では公開鍵方式による電子認証がサポートされていますので、パスワード認証ができなくても電子認証鍵があればログインはできるのです。

例えば、下図のようにサーバに南京錠 (公開鍵) をかけて保護します。この南京錠の鍵 (秘密鍵) を持っていなければ、サーバにログインできないわけです。

public_key_authentication

もちろん、鍵 (秘密鍵) を盗まれてしまえば意味がありませんので、取り扱いには十分な注意が必要です。

電子認証鍵の生成 (Windows)

鍵を作るのは簡単です。Windows 機で作成する場合は、Teraterm Pro (TTSSH2)Putty ごった煮版 などの SSH クライアントソフトで生成が可能です。(※ Putty で生成されるキーを使用する場合は、OpenSSH 形式にコンバートしないと使えません)

以下に TTSSH での生成方法を説明します。

  1. TTSSH のメニューの「設定 (S)」→「SSHキー生成 (N)」を選択します。

    create_rsa-01

  2. 「RSA」にチェックした状態で「生成」 ボタンをクリックします。

    create_rsa-02

    パスワード欄には秘密鍵を使用するためのパスワードを入力します。
    入力しない場合は、秘密鍵さえ持っていればパスワード無しでの SSH ログインが可能です。

  3. 「秘密鍵の保存 (P)」をクリックし、「id_rsa」という名前で秘密鍵 (鍵) を保存します。
  4. 同じように「公開鍵の保存 (C)」をクリックし、「id_rsa.pub」という名前で公開鍵 (錠前) を保存します。

これで、電子認証における「錠前」と「鍵」ができました。

サーバに鍵をかける

鍵ができたら、サーバに錠前で鍵をかける操作が必要です。サーバ機に SCP やフロッピーディスクなどで電子認証ログインを行うユーザのホームディレクトリへ id_rsa.pub (錠前) を転送します。

※ 絶対にメモ帳などのエディタで編集しないようにしてください。

ホームディレクトリの id_rsa.pub を、.ssh/authorized_keys と言う名前で保存します。.ssh/ が無い場合は作成します。

注意: Windows から転送した錠前 (公開鍵) は、パーミッションを適切に設定しないと正常に電子認証を行うことができません。

電子認証鍵の生成 (LINUX)

LINUX 側で認証鍵を作るには、ssh-keygen コマンドを使います。

出来上がった公開鍵 (錠前) は、authorized_keys にリネームします。

あとは、.ssh/id_rsa (秘密鍵) を SCP やフロッピーディスクなどで電子認証を行うクライアントへ転送します。

電子認証ログイン

SSH 接続時、パスフレーズの入力 と併せて「RSA/DSA鍵を使う」 を選択し、生成した「id_rsa」 ファイルを指定することでログインできるようになります。パスフレーズを設定しないで認証鍵を作成していれば、ユーザ名と秘密鍵を指定するだけでパスワード入力を省略することができます。

rsa_login

秘密鍵を持たないユーザの SSH ログインを拒否する

秘密鍵を使ってログインできることが確認できたら、パスワードのみの認証を行わないよう sshd の設定を変更します。設定ファイルは /etc/ssh/sshd_config です。

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
↓
PasswordAuthentication no

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
↓
ChallengeResponseAuthentication no

設定を反映させるため、sshd を再起動します。