web-dev-qa-db-ja.com

SSH –シェルがなくてもログイン時にコマンドを強制実行

ポート転送専用のシェルなしで制限付きユーザーを作成していますが、SSHサーバーにシェルを要求しないssh -N user@Hostを介してユーザーが接続されている場合でも、pubkeyを介してログイン時にスクリプトを実行する必要があります。

スクリプトは、pubkeyで認証された接続についてadminに警告する必要があるため、接続するユーザーはスクリプトの実行をスキップできません(たとえば、ssh -Nで接続することにより)。

私は無駄にしようとしました:

  • /etc/ssh/sshrcでコマンドを設定します。
  • .ssh/authorized_keys(man authorized_keys)でcommand = "COMMAND"を使用する
  • ユーザーのシェルとしてコマンドを使用してスクリプトを設定します。 (chsh -s /sbin/myscript.sh USERNAME
  • /etc/ssh/sshd_configのような一致するユーザー:Match User MYUSERNAME ForceCommand "/sbin/myscript.sh"

ユーザーがシェルを要求した場合はすべて機能しますが、ポート転送のみをログに記録し、シェル(ssh -N)を使用しない場合は機能しません。

15
Iacchus

私はOPの著者です。私が達成する必要があるのは、今日までSSHだけでは不可能だという結論に達しました(OpenSSH_6.9p1 Ubuntu-2, OpenSSL 1.0.2d 9 Jul 2015)しかし、暗号化されたSPAuthenticationを使用してSSHポートを開く素晴らしいソフトウェアを見つけました。新しいバージョン(この投稿の日付まではGitHubマスターブランチ)には、ユーザーが正常に認証するコマンドを常に実行する機能があります。

FWKNOP-暗号化された単一パケット認証

FWKNOPは、UDPを介して送信される暗号化された単一のパケットに対して特定のポートへのアクセスを許可するiptablesルールを設定します。次に、許可後、許可されたユーザーに30秒などの一定時間アクセスを許可し、その後ポートを閉じて、接続を開いたままにします。

1. Ubuntu Linuxにインストールするには:

これまでのUbuntuリポジトリ上の現在のバージョン(2.6.0-2.1build1)では、正常なSPAでコマンドを実行できません。 (代わりにGitHubの2.6.8を使用してください)

クライアントマシン上:

Sudo apt-get install fwknop-client

サーバー側:

Sudo apt-get install fwknop-server

クライアントマシンとサーバーマシンのセットアップ方法に関するチュートリアルがあります https://help.ubuntu.com/community/SinglePacketAuthorization

次に、サーバー側で、セットアップ後、

  1. 編集/etc/default/fwknop-server
  2. 行を変更しますSTART_DAEMON="no"からSTART_DAEMON="yes"
  3. 次に実行します:

    Sudo service fwknop-server stop

    Sudo service fwknop-server start

2. SPAの成功に関する管理者への警告(メール、プッシュオーバースクリプトなど)

そのため、上記のように、Ubuntuリポジトリ(2.6.0-2.1build1)にある現在のバージョンは、正常なSPAでコマンドを実行できません。 OPの時点でこの機能が必要であるが、fwknopバージョン(2.6.8)でリリースされる場合、以下に記載されているとおりです。

https://github.com/mrash/fwknop/issues/172

そのため、今すぐ使用する必要がある場合は、CMD_CYCLE_OPENオプション。

3. fwknopのその他のリソース

https://help.ubuntu.com/community/SinglePacketAuthorization

https://github.com/mrash/fwknop/ (GitHubのプロジェクト)

http://www.cipherdyne.org/fwknop/ (プロジェクトサイト)

https://www.digitalocean.com/community/tutorials/how-to-use-fwknop-to-enable-single-packet-authentication-on-ubuntu-12-04 (DOのチュートリアルコミュニティ)

3
Iacchus

ForceCommand オプションは、クライアントが要求しない限り、PTYなしで実行されます。その結果、実際にスクリプトを期待どおりに実行するシェルがありません。さらに、OpenSSH SSHD_CONFIG(5)のマニュアルページには次のように明記されています。

このコマンドは、ユーザーのログインシェルに-cオプションを指定して起動します。

つまり、ユーザーのログインシェルを無効にした場合、または/bin/falseのようなものに設定した場合、ForceCommandは機能しません。仮定して:

  1. ユーザーには賢明なシェルが定義されており、
  2. ターゲットスクリプトが実行可能であること、および
  3. スクリプトに適切なシバン行があること

次に、適切なユーザー名とカスタムスクリプトへの完全修飾パス名で適切に変更されると、globalsshd_configファイルで次のように動作します。

Match User foo
    ForceCommand /path/to/script.sh
12
Todd A. Jacobs

私はOPの著者です。また、次のようにpython3で記述された単純なログウォッチャーを実装できます。これは、ファイルの読み取りを続け、行にパターンが含まれている場合にコマンドを実行します。

logwatcher.python3

#!/usr/bin/env python3

# follow.py
#
# Follow a file like tail -f.

import sys
import os
import time

def follow(thefile):
    thefile.seek(0,2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.5)
            continue
        yield line

if __name__ == '__main__':
    logfilename = sys.argv[1]
    pattern_string = sys.argv[2]
    command_to_execute = sys.argv[3]

    print("Log filename is: {}".format(logfilename))

    logfile = open(logfilename, "r")
    loglines = follow(logfile)

    for line in loglines:
        if pattern_string in line:
            os.system(command_to_execute)

使用法

  1. 上記のスクリプトを実行可能にします。

chmod +x logwatcher.python3

  1. 再起動後に起動するcronjobを追加します

crontab -e

次に、この行をそこに書き、この後に保存します。

@reboot /home/YOURUSERNAME/logwatcher.python3 "/var/log/auth.log" "session opened for user" "/sbin/myscript.sh"

このスクリプトの最初の引数は監視するログファイル、および2番目の引数は検索対象の文字列です。 番目の引数は実行するスクリプトファイルに行が見つかったとき。

クラッシュした場合にスクリプトを起動/再起動するために、より信頼性の高いものを使用するのが最適です。

1
Iacchus