Mac に SSH でリモートログインする方法

Mac に SSH でリモートログインする方法

macOS で外部から SSH でのリモートログインを有効化する方法(いわゆる SSH サーバ機能)について紹介します。また、セキュリティを強化する方法についても紹介します。

SSH でのリモートログインの許可のみであれば、非常に簡単な設定で有効化することができます。

SSH でのリモートログインを有効化する

  1. 「システム環境設定」の「共有」を開く
  2. 「リモートログイン」のチェックボックスにチェックを入れる。
  3. リモートログインが有効化されたことを確認

これでリモート PC から以下のようなコマンドで Mac に SSH でログインすることができます。
例:ユーザ名が「user01 」、ログインしたい Mac の IP アドレスが「192.168.100.6」の場合

ssh user01@192.168.100.6

SSH サーバに関するセキュリティ強化設定

上記のように非常に簡単に SSH によるリモートログインを有効化することができますが、 MacBook など、Mac を外出先で利用することがある場合、デフォルト設定のままではセキュリティ強度はけっして強くはありません。

そのため、以下のような設定を追加し、セキュリティを強化しましょう。

SSH リモートログインを許可するユーザを制限する

デフォルトでは Administrators グループに所属するユーザは全てリモートログインが許可されます。もし、リモートログインが不要なユーザが Administrators グループに含まれている場合は、必要なユーザのみ、リモートログインを許可しましょう。

以下の例では、「user01」のみリモートログインを許可しています。

SSH 接続ポートを変更する

SSH のデフォルト接続ポートは「22」ですが、このポートを変更すると、攻撃されるリスクを減らすことができます。

UNIX 系 OS の SSH サーバの設定ファイルは「/etc/ssh/sshd_config」に置かれていることが多いですが、Mac の場合だとこの設定ファイルの Port 項目を変更しても、SSH の待ち受けポートを変更することができません。

これは、SSH サービスの plist ファイルに待ち受けポートの設定が記載されているためです。
plist の本体のパス:/System/Library/LaunchDaemons/ssh.plist

以前はこの ssh.plist ファイルを直接編集することで簡単に待ち受けポートを変更できましたが、OS X 10.11 El Captian から、「System Integrity Protection」という /System 等のシステム領域の変更を防ぐ機能が追加されたため、ポート変更を行うには以下のいずれかの方法を取る必要があります。

  1. ssh_port.plist 等の別の plist ファイルを作成し、OS 標準の SSH デーモンとは別で SSH デーモンを立ち上げる
  2. 「System Integrity Protection」を一度無効化し、ssh.plist を書き換える
  3. /etc/services の ssh の項目を変更し、ssh = 22 の割り当てを別に変更する
    (ただし、ssh クライアントのデフォルト接続ポートも変更されます)

今回は「1」の方法を紹介します。

  1. 以下のコマンドを実行し、ssh.plist をベースに ssh_port.plist を作成する
    #ssh.plist をコピーする
    sudo cp /System/Library/LaunchDaemons/ssh.plist  /Library/LaunchDaemons/ssh_port.plist
  2. 以下のコマンドを実行し、default コマンドで SSH の接続ポートを変更する
    例:22 => 50022

    #ssh ポートを 50022 に変更する
    sudo defaults write /Library/LaunchDaemons/ssh_port.plist Sockets '<dict><key>Listeners</key><dict><key>Bonjour</key><array><string>ssh</string><string>sftp-ssh</string></array><key>SockServiceName</key><string>50022</string></dict></dict>'
    
  3. 作成した plist を launchd に登録し、自動起動するよう設定する
    #launchd に ssh サービスを登録する
    sudo launchctl load /Library/LaunchDaemons/ssh_port.plist
    
  4. 「システム環境設定」の「共有」を開き、「リモートログイン」チェックボックスのチェックを外して一度無効化し、再度、有効化する
  5. 以下のコマンドを実行し、「50022」で接続を待ち受けていることを確認する
    #50022 ポートの待ち受けを確認する
    netstat -anl|grep 50022

    以下のような結果が帰って来れば OK です

    tcp4       0      0  *.50022                *.*                    LISTEN     
    tcp6       0      0  *.50022                                       *.*                                           LISTEN

なお、デフォルトの「22」に戻したい場合は下記のコマンドを実行します。

#launchd から ssh サービスを削除する
sudo launchctl unload /Library/LaunchDaemons/ssh_port.plist
#/Library/LaunchDaemons から削除する
sudo rm /Library/LaunchDaemons/ssh_port.plist

コマンド実行後に「システム環境設定」の「共有」を開き、「リモートログイン」チェックボックスのチェックを何度か入れたり外したりすると、元にもどります。

ここまでの手順は、 launchd には com.openssh.sshd というサービスが 2 重に登録されるが、 /System/Library/LaunchDaemons/ よりも /Library/LaunchDaemons/ に格納されている plist のほうが優先される仕組みを利用しています。

 

なお、外部の PC から SSH する際は、「-p」オプションをつけてポートを指定しましょう。
例:接続ポートを 50022 に変更した場合

ssh -p 50022 user01@192.168.100.6

まとめ

SSH 可能なユーザとポート変更する手順を紹介しましたが、さらにセキュリティを強化するためには、ssh でのログイン認証方式を共通鍵認証方式のみに限定し、パスワード認証は無効化したほうがよいのですが、今のところ私は、OS 標準の機能を使ってこれを実現する方法を見つけられていません。※もちろん、OS 標準機能に頼らなければ可能ですが…

もし、どなたか方法を知っている方がいらっしゃればご教示いただけると幸いです。