このエントリーをはてなブックマークに追加


sshでのrootログインを禁止しssh経由でのroot権限では指定のコマンドだけを実行できるようにする方法

本資料では、sshでrootによるログイン禁止環境で指定のコマンドだけをroot権限で実行できるようにする方法を記述した資料です。


スポンサーリンク

関連記事

sshのセキュアな運用

sshはもっとも一般的なリモートシェルプログラムです。
ネットワーク上にあるマシンにログインしたり、コマンドを遠隔実行したりすることができます。
通信経路は暗号化され、認証も公開鍵方式によって安全性が提供されています。
しかし、セキュリティのための機能とセキュアに運用することは別次元の問題です。
安全性の高い機能があっても運用に問題があればセキュアではありません。

たとえば、セキュリティの観点において、ネットワーク上のマシンにrootで直接ログインすること
(ログインを可能とする設定のままにすること)は問題があるとされています。
特に認証鍵にパスワードを付与しない設定でのrootログインは、
悪意の第三者が存在した場合などだけでなく、ケアレスミスの発生等も考えれば非常に危険です。

しかし、実際の運用においてはrootによる直接ログインは多用されていると思います。

rootによる直接ログインは禁止したいが、
運用上root権限での遠隔コマンド実行が必要である。
そのようなケースは多いでしょう。 いったん一般ユーザでログインしてからsusudoを利用すればいいかも知れませんが、
逆にその煩雑さがオペレーションミスを生むかも知れません。
ルーティン処理をスクリプトなどで自動化したくともそれが邪魔になるかも知れません。

限定した形でssh経由でのroot権限の利用を可能とするために、sshの機能である
「自動コマンド実行機能専用の公開鍵作成」と、
「root権限では自動コマンド実行機能のみ許可」という設定を利用してみます。

sshの自動コマンド実行機能

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で非対話的なコマンドはほとんど利用可能だと思います。

公開鍵をコマンドを実行したい対象マシン・ユーザの~/.ssh/authorized_keysに登録する

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の設定変更

対象マシンの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権限では指定のコマンドだけを実行できるようにする方法についてでした。


スポンサーリンク


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-02-11 (土) 11:41:27 (586d)