
いくつかの制限(たとえば、1 つのコマンドしか使用できず、そのコマンドを使用すると別のコマンドも実行される)がある偽のユーザー(SSH からログオンできるがシステム上に存在しないユーザー)を作成しようとしています。これを実現する方法はありますか?制限部分はもちろん、openssh-server で偽のユーザーを作成する方法も見つかりません。
答え1
Linux の SSH サーバーは、システムに統合され、別のユーザー層を導入しないのが一般的です。Samba や FTP のように、Samba 固有または FTP 固有のユーザー層が存在するわけではありません。OpenSSHsshd
から独立したユーザー セットを定義するのは簡単な作業ではないと思います (ただし、別の答えが私を驚かせるかもしれません)。
おそらく、偽のユーザーを作成する意図は、SSH サーバーで root ではないため、そこに実際のユーザーを作成できないという事実から生じているのでしょう。そうであれば、とにかく次の操作を実行できます1 :
man 5 authorized_keys
フォーマットの説明がある箇所を参照してください。私の Debian のマニュアルには次のように記載されています (強調は筆者による)。
AuthorizedKeysFile
公開鍵認証用の公開鍵を含むファイルを指定します。このオプションが指定されていない場合、デフォルトは~/.ssh/authorized_keys
と です~/.ssh/authorized_keys2
。ファイルの各行には 1 つの鍵が含まれます (空行および '#' で始まる行はコメントとして無視されます)。公開鍵は、オプション、キータイプ、base64 でエンコードされたキー、コメントのスペースで区切られたフィールドで構成されます。オプション フィールドはオプションです。[…]オプション (存在する場合) は、コンマで区切られたオプション指定で構成されます。二重引用符で囲まれている場合を除き、スペースは使用できません。次のオプション指定がサポートされています (オプション キーワードは大文字と小文字を区別しないことに注意してください)。
[…]
command="command"
このキーが認証に使用されるたびにコマンドが実行されることを指定します。ユーザーが指定したコマンド (ある場合) は無視されます。クライアントが pty を要求した場合、コマンドは pty 上で実行されます。それ以外の場合は、tty なしで実行されます。8 ビットのクリーン チャネルが必要な場合は、pty を要求しないか、 を指定する必要がありますno-pty
。バックスラッシュで囲むことで、コマンドに引用符を含めることができます。このオプションは、特定の公開キーが特定の操作のみを実行するように制限する場合に役立ちます。例としては、リモート バックアップのみを許可するキーなどがあります。
restrict
キー オプションなどを使用して明示的に禁止されていない限り、クライアントは TCP および/または X11 転送を指定できることに注意してください。[…]
この方法では、通常のユーザーとして、他のユーザー(これからはゲスト)がログインできるようにすることができます。あなたと同じように特定のコマンドを実行するあなたと同じように~/.ssh/authorized_keys
自動的に。オプションを使用して、サーバーに公開キーを登録するだけですcommand="command"
。
コマンドは、ゲストがリストからタスクを選択したり、キーワードを入力してタスクを選択したり、検証されて許可または拒否される「内部」コマンドを入力したりできるカスタム プログラムまたはスクリプトである可能性があります。その後、プログラムはそれに応じて何かを実行します。コマンド/プログラム/スクリプトが何であるかは、あなた次第です。
SSHサーバーとその管理者の観点から見ると、ゲストはコマンドを実行するのはあなたのアカウントであり、カスタムプログラムまたはスクリプトがゲストに何らかの方法で任意のコマンドを実行できるようにする場合(たとえば、何らかの方法で最初にシェルを生成するなど)、あなたコマンドを実行します。
また、コマンドは非対話型シェルで実行されることにも留意してください。これは、設定に応じて、シェル( で選択したシェルchsh
)になります。シェルはいくつかのファイルを読み込みます(Bashの動作) なので、ゲストが接続するときに安全に取得できることを確認してください。
マニュアルには、「ユーザーが指定したコマンド(ある場合)は無視されます」と記載されています。しかし、私のテストでは、強制実行ファイルは環境から取得できましたSSH_ORIGINAL_COMMAND
。変数の名前は です。つまり、ゲストが の呼び出し時にいくつかの情報(オプションなど)を直接渡すことができるということですssh
。サーバー側では、プログラムが変数から取得します。シェルコードでは、変数eval
はそして$SSH_ORIGINAL_COMMAND
引用符なしで使用しないでください安全性を確認するか、事前に消毒しない限り、使用しないでください。
~/.ssh/authorized_keys
特定のキーの所有者が の出力を確認できるようにする の行の例はdf -h
次のようになります。
command="df -h",no-pty ssh-rsa AAA…(public key here)…
( の説明についてはno-pty
を参照してくださいman 5 authorized_keys
。他にも役に立つオプションがあります。) これで、この特定のキーを使用して (あなたのログインを使用して) サーバーに接続すると、 の出力が表示されdf -h
、切断されます。
1おそらく。SSH サーバーはさまざまなものを拒否するように設定されている可能性があります。
答え2
SSH ハニーポットの導入を検討してもよいでしょう。基本的には、脆弱に見えますが実際には何にもアクセスできないダミー サーバーです。すべてがログに記録され、コマンドへのアクセスを制限できます。
設定は難しくなく、導入方法についてはオンライン リソースが多数あります。ただし、ここで回答するには少し長すぎるかもしれません。
編集 :Superuser は実際には推奨を行う場所ではありませんが、オンラインで多くのチュートリアルがあり、よく使用されている場所のようです。https://github.com/cowrie/cowrie READMEより:
エミュレートされたシェルとして実行することを選択します (デフォルト):
- ファイルの追加/削除機能を備えた偽のファイルシステム。Debian 5.0インストールに似た完全な偽のファイルシステムが含まれています。
- 偽のファイルコンテンツを追加して、攻撃者が /etc/passwd などのファイルを cat できるようにする可能性。最小限のファイルコンテンツのみが含まれます。
- Cowrie は、wget/curl でダウンロードしたファイルや SFTP および scp でアップロードしたファイルを後で検査できるように保存します。