本資料では、sshでrootによるログイン禁止環境で指定のコマンドだけをroot権限で実行できるようにする方法を記述した資料です。
sshはもっとも一般的なリモートシェルプログラムです。
ネットワーク上にあるマシンにログインしたり、コマンドを遠隔実行したりすることができます。
通信経路は暗号化され、認証も公開鍵方式によって安全性が提供されています。
しかし、セキュリティのための機能とセキュアに運用することは別次元の問題です。
安全性の高い機能があっても運用に問題があればセキュアではありません。
たとえば、セキュリティの観点において、ネットワーク上のマシンにrootで直接ログインすること
(ログインを可能とする設定のままにすること)は問題があるとされています。
特に認証鍵にパスワードを付与しない設定でのrootログインは、
悪意の第三者が存在した場合などだけでなく、ケアレスミスの発生等も考えれば非常に危険です。
しかし、実際の運用においてはrootによる直接ログインは多用されていると思います。
rootによる直接ログインは禁止したいが、
運用上root権限での遠隔コマンド実行が必要である。
そのようなケースは多いでしょう。
いったん一般ユーザでログインしてからsuやsudoを利用すればいいかも知れませんが、
逆にその煩雑さがオペレーションミスを生むかも知れません。
ルーティン処理をスクリプトなどで自動化したくともそれが邪魔になるかも知れません。
限定した形でssh経由でのroot権限の利用を可能とするために、sshの機能である
「自動コマンド実行機能専用の公開鍵作成」と、
「root権限では自動コマンド実行機能のみ許可」という設定を利用してみます。
sshの機能として公開鍵に実行したいコマンドを指定することができます。
その設定を行った公開鍵を使うと、ログインや任意のコマンドの実行はできなくなります。
ただ指定のコマンドだけが自動的に実行されて、すぐに接続が完了します。
他のことは何もできません。
そのコマンド実行専用の公開鍵となります。
この機能の利用手順は以下の通りです。
自動コマンド実行機能を利用したいマシン上の任意のユーザで、新しい公開鍵を作成します。
(既存の公開鍵を使うこともできますが新しいものを作ったほうがいいでしょう。)
新しい公開鍵ファイル(ファイル名: ~/.ssh/command_only)を-fオプションで指定して、
ssh-keygenコマンドを実行します。
これがコマンド自動実行機能専用の公開鍵ファイルになります。
% ssh-keygen -f ~/.ssh/command_only Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user01/.ssh/command_only. Your public key has been saved in /home/user01/.ssh/command_only.pub. The key fingerprint is: 88:52:12:eb:cb:b4:f0:58:6a:de:15:5f:69:c7:a9:81 user01@ubuntu The key's randomart image is: +--[ RSA 2048]----+ | . | | o | | o . | | . o . .. o . | |. = ...ES= + | | O + o o + | |o.= . . . | |o . . | | . . | +-----------------+ %
作成された公開鍵ファイル~/.ssh/command_only.pubをエディタで開き、
ファイルの先頭に以下のような語句を追加します。
command="実行したいコマンド名"
例えば、lsコマンドを指定して設定すると、公開鍵ファイルの内容は以下のようになります。
command="ls -l" ssh-rsa AAAAB3NzaC1yc......
コマンドにはオプション引数も指定できますし、シェルスクリプトも登録できるので、
CUIで非対話的なコマンドはほとんど利用可能だと思います。
command句を追加した自動コマンド実行専用の公開鍵データを、
対象のマシンのコマンドを実行させたいユーザの~/.ssh/authorized_keysに登録します。
これは通常の公開鍵の登録手順とまったく同じです。
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsXTxFq88NS6a+1s2IdOY0YjT/t7DXUkPByUz1rDK41jPlVdZQuxYnRkc14/i39qGnLZTsKKpTi8UeSStYoYplllTvckf4lX8OvLFIeboW98ZbuJ8q64sw8LNwRcgFvWpxleOJ19sCRPrJ/T4xQIXyvE8yyvyIct/ID/2ZwXUmlSK74A2k+TcbPds2Mcoc9W8Q2sjuVVR2do9Oru8EEd+AqM+vCPg/SlxGYggRZZQgE6+txMm6zMM8zkBZc68RpHJeUIto3YMELczQuRLks/puyvmvPEGmcqP+9OozWEKe8hEBUQuC4eawV1LqNEXBKJ75uclszNYR5YRY6Vt1R+EAQ== user01@ubuntu command="ls -l" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPAruvXDwCspfrftVsf4lO9B0mJVPcB7zuGAFikn6TdF2kW7MU+CEE3fAFZARCYA6e2Be17pwtB2WKFEPVXcx5ng74xJvEWbyo6viblroMVwoEVNXpUEG81dQM73RjXhqyE/fUaw+s2n3gTBtBK2UZyFdg0F3efVilqCiRjxz4Sf4VS8SaDqhvETWKpJ2oSolBp8kUE4DgVJ4KOfCOJHLldrJCDs89mQsuTuOzrYgeDO2Trk/tegnzUYlXsngFAG7E+/DGPT3M2vEp8n9LlCVddXMEv0zavvdlNeDOLD5c+bW+N9qBIPYiLwUm8LmJF1cum47SMCO2dvB8yPdWs/jR user01@ubuntu
今回は、対象マシン server のrootユーザの/root/.ssh/authorized_keysに登録しました。
二行目に追加しています。
(一行目は通常のログインや遠隔コマンド実行で使っていた公開鍵です。
次項で『root権限では自動コマンド実行機能のみ許可』を設定しなければ、
自動コマンド実行用の鍵と両立可能です)
作成した鍵をsshの-iオプションで指定して、対象に接続します。
% ssh -i ~/.ssh/command_only root@server -rwxr-xr-x 1 root root 24 8月 15 17:59 test.sh -rw-r--r-- 1 root root 0 8月 15 17:57 test.txt Connection to server closed. %
指定したコマンドls -lが実行され、対象マシンの/rootにあったファイルが表示され、その後すぐに接続が切られました。
なお、この自動コマンド実行機能は、rootに限らずどんなユーザであっても利用可能です。
これまでの手順で自動コマンド実行専用の公開鍵の作成と登録ができました。
次の手順で、rootでのログインを禁止し、自動コマンド実行機能による接続のみを可能とします。
対象マシンのroot権限で、sshdの設定ファイル/etc/ssh/sshd_confgをエディタで編集し、
設定句PermitRootLoginを、forced-commands-onlyに変更します。
変更前
# Authentication: LoginGraceTime 120 PermitRootLogin yes StrictModes yes
変更後
# Authentication: LoginGraceTime 120 PermitRootLogin forced-commands-only StrictModes yes
設定を変更後、sshdを再起動します。
root@server:~# service ssh restart ssh stop/waiting ssh start/running, process 31269 root@server:~#
再起動後は、先程の自動コマンド実行接続はできますが、通常のログインはできなくなっています。
% ssh -i ~/.ssh/command_only root@server 合計 4 -rwxr-xr-x 1 root root 24 8月 15 17:59 test.sh -rw-r--r-- 1 root root 0 8月 15 17:57 test.txt Connection to server closed. ubuntu[1]%
通常のログインを試みると、パスワードの入力を求められますが、何を入力しても無効になります。
% ssh root@server root@server's password: Permission denied, please try again. root@server's password: Permission denied, please try again. root@server's password: Permission denied (publickey,password).
以上、sshでのrootログインを禁止し、ssh経由でのroot権限では指定のコマンドだけを実行できるようにする方法についてでした。