Ubuntu 22.04 Server / rootでローカルログイン・SSH接続する方法

Ubuntu 22.04 Serverでroot権限を使う基本は、一般アカウントでログインしてsudo -iを実行する方法です。rootで直接ログインする場合はパスワードとログイン方針を別々に確認し、SSHではPermitRootLoginと認証方式の条件も満たす必要があります。

root権限での作業と直接ログインの違い

rootはシステム全体を管理するアカウントです。Ubuntuは標準でrootのパスワードをロックし、許可された一般ユーザーが自分の認証情報でsudoを使う仕組みです。rootアカウント自体がないわけではありません。標準動作はUbuntuのユーザー管理文書を参照してください。

管理用シェルだけが必要なら、次のコマンドを使います。通常は一般アカウントのパスワードで認証しますが、sudoの方針によって異なります。whoamiがrootを表示することを確認し、終了後はexitで一般アカウントに戻ります。rootのパスワードやSSHの方針は有効化・変更されません。

sudo -i
whoami
exit

コンソールでrootのパスワードを使う場合や、su -で切り替える必要がある場合に限り、別途パスワードを設定します。最初のsudo認証は一般アカウント、その後の2回の入力は新しいrootパスワードです。入力文字は画面に表示されません。

sudo passwd root
su -
whoami
exit

su -には設定したrootパスワードを入力します。パスワードを設定してもすべてのログイン方式が許可されるわけではなく、PAM(Pluggable Authentication Modules)やコンソール・遠隔接続の方針で制限される場合があります。sudo -iの意味はUbuntu 22.04のsudoマニュアルで確認できます。

SSH設定前に接続経路と既存方針を確認する

以下は管理権限を持つUbuntu 22.04サーバーのOpenSSH設定です。一般アカウントの既存SSHセッションを開いたままにし、物理コンソールやクラウドの復旧コンソールも準備してください。本番環境では一般アカウントでSSH接続してsudoを使う構成を優先的に検討します。root直接接続が必要なら、公開鍵方式と接続可能な管理ネットワークの範囲も決めます。

SSHサーバーが未導入なら、sudo apt updateの後にsudo apt install openssh-serverを実行します。サービスはsudo systemctl status ssh.serviceで確認できます。サーバーのアドレスと実際のSSHポートを確認し、ファイアウォールとクラウドの通信規則も管理経路を許可する必要があります。

変更前に設定をバックアップし、関連項目を探します。同名のバックアップがある場合は別名にして上書きを避けてください。バックアップは、次の例のように*.confとして読み込まれるディレクトリの外に保管します。

sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.before-root-login
sudo cp -a /etc/ssh/sshd_config.d /etc/ssh/sshd_config.d.before-root-login
sudo grep -RnsE '^[[:space:]]*(Include|Match|PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|AuthenticationMethods|AllowUsers|DenyUsers|AllowGroups|DenyGroups)' /etc/ssh/sshd_config /etc/ssh/sshd_config.d

サーバーの設定はsshd_configで、クライアントのssh_configとは異なります。Ubuntu 22.04は通常/etc/ssh/sshd_config.d/*.confを先に読み込みます。多くの項目は最初の値が使われるため、末尾への追加では先行設定を上書きできない場合があります。Includeの順序、Match条件、クラウド生成設定を調べ、有効値を検証してください。

Ubuntu 22.04のsshd_configマニュアルでは、PermitRootLogin yesは他の認証条件を満たすroot接続を許可します。prohibit-passwordはrootのパスワード・キーボード対話型認証を禁止しますが、公開鍵は許可できる設定です。noはrootのSSHログインを禁止します。コメント化された標準値の1行だけで実際の方針を判断しないでください。

rootのパスワードでSSH接続する設定

この方式はrootのパスワード認証を公開するため、必要な管理環境でのみ選んでください。sudo passwd rootでパスワードを設定し、有効な設定を持つファイルをsudoedit /etc/ssh/sshd_configまたは該当スニペットの編集で変更します。次は設定例であり、無条件に末尾へ追記する手順ではありません。

PermitRootLogin yes
PasswordAuthentication yes

PermitRootLogin yesだけでは不十分です。パスワード認証、AuthenticationMethods、ユーザー・グループ制限、PAM、アカウント状態も満たす必要があります。全体に適用されるPasswordAuthentication yesは他のユーザーにも影響するため、既存方針を広げないか確認してください。この手順のためにファイアウォールや多要素認証を無効にしないでください。

保存だけでは適用は完了しません。後述の検証と再読み込み後にクライアントから試します。例の192.0.2.20は実際のサーバーアドレスに置き換え、標準の22番以外ならssh -p PORTで実際の番号を指定してください。

ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password root@192.0.2.20

この試験では公開鍵ではなくパスワード認証を選びます。追加認証が必要なサーバーではパスワードだけでは接続できません。ホスト鍵の指紋は信頼できる管理経路で確認し、鍵変更の警告を回避するために検証を無効にしないでください。

公開鍵でrootのSSH接続を行う

公開鍵認証ではクライアントが秘密鍵を保持し、対応する公開鍵だけをサーバーに登録します。rootのパスワードログイン有効化は必須ではありません。既存の管理セッションやコンソールから登録できるため、鍵の導入のためにrootのパスワードSSH接続を先に開く必要はありません。

適切な鍵がクライアントになければssh-keygen -t ed25519で生成します。既存鍵を上書きせず新しいファイル名を選び、秘密鍵にはパスフレーズを設定してください。公開鍵ファイル~/.ssh/id_ed25519.pubの1行を登録します。.pubのない秘密鍵をサーバーにコピーしないでください。

サーバーの既存管理セッションで、次のようにディレクトリとファイルの権限を準備し、エディターでクライアントの公開鍵を1行追加します。既存の鍵を保全し、同じ鍵を重複登録しないでください。別の鍵名を使った場合は、その公開鍵を選びます。

sudo install -d -m 700 -o root -g root /root/.ssh
sudo touch /root/.ssh/authorized_keys
sudo chown root:root /root/.ssh/authorized_keys
sudo chmod 600 /root/.ssh/authorized_keys
sudoedit /root/.ssh/authorized_keys

これは標準の公開鍵登録先を使う例です。AuthorizedKeysFileが別の場所を指定していれば、そのパスを確認します。rootのパスワード認証を許可しない次の方針を選び、先行する競合設定を調整してから検証してください。

PermitRootLogin prohibit-password
PubkeyAuthentication yes

サーバー設定を検証・適用した後、クライアントから次のように接続します。秘密鍵のパスフレーズを求められたら、クライアント鍵のパスフレーズを入力します。rootのパスワードとは異なります。公開鍵でもPAM、アカウント、アクセス制限などの条件を満たす必要があります。

ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes root@192.0.2.20

設定を検証し、新しいセッションで試す

  1. まずサーバーで構文とホスト鍵の状態を検査します。-tは成功時に通常何も表示しません。エラーがあれば再読み込みせず、該当ファイルと行を修正します。-Tは有効な設定を表示し、-Cを組み合わせると指定接続のMatch条件を評価できます。
sudo /usr/sbin/sshd -t
sudo /usr/sbin/sshd -T -C user=root,addr=192.0.2.10,host=admin.example | grep -E '^(permitrootlogin|passwordauthentication|pubkeyauthentication|authenticationmethods|authorizedkeysfile|allowusers|denyusers|allowgroups|denygroups) '

192.0.2.10をサーバーから見た実際の管理クライアントのアドレス、admin.exampleを評価対象のクライアントホスト名に置き換えます。Match LocalAddressやLocalPortを使う場合は-Cにladdrとlportも指定してください。予想外の値なら優先順位と条件を調査します。各オプションはUbuntu 22.04のsshdマニュアルで確認できます。

  1. 構文検査に成功し、有効値が意図した方針と一致したらサービスを再読み込みします。既存管理セッションは閉じず、別のクライアント画面で前述のパスワードまたは鍵方式を試してください。
sudo systemctl reload ssh.service
sudo systemctl is-active ssh.service
  1. サービスがactiveでも、新規認証の成功は保証されません。新しいrootセッションでwhoamiがroot、id -uが0か確認します。一般アカウントも新規接続してsudoを試してください。ユーザー、鍵、ネットワーク、アカウント条件によっては接続が拒否されます。

接続失敗の確認とroot直接ログインの解除

Permission deniedでは認証・アカウント・アクセス方針を、タイムアウトや接続拒否ではアドレス・ポート・サービス・ファイアウォールを分けて調べます。サーバーはsudo journalctl -u ssh.service -n 50 --no-pager、クライアントはssh -v root@192.0.2.20で記録を確認できます。共有時はアドレスやユーザー名などを伏せてください。

rootのSSHを再び禁止するには、有効なPermitRootLoginをnoにし、sshd -tと接続条件付きのsshd -Tを確認後、sudo systemctl reload ssh.serviceを実行します。一時変更したパスワード認証方針も戻してください。変更したファイルと項目のみを復元し、スニペットディレクトリ全体をむやみに上書きしません。

別の一般アカウントでSSHとsudoが使えることを確認し、今回有効化したrootパスワードが不要になったら次でロックします。passwdマニュアルの-lはパスワードのロックであり、公開鍵などの全接続方式を遮断するものではありません。SSHの禁止はPermitRootLogin noで別途確認します。

sudo passwd -l root

パスワードのロックやSSH設定変更は既存のrootセッションを自動終了しません。必要な作業を終え、開いたrootシェルをexitで閉じます。復旧が必要なら開いたままの一般アカウントや復旧コンソールで、バックアップと変更記録に基づき設定を戻してください。