ポート転送専用のシェルなしで制限付きユーザーを作成していますが、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
)を使用しない場合は機能しません。
私はOPの著者です。私が達成する必要があるのは、今日までSSHだけでは不可能だという結論に達しました(OpenSSH_6.9p1 Ubuntu-2, OpenSSL 1.0.2d 9 Jul 2015
)しかし、暗号化されたSPAuthenticationを使用してSSHポートを開く素晴らしいソフトウェアを見つけました。新しいバージョン(この投稿の日付まではGitHubマスターブランチ)には、ユーザーが正常に認証するコマンドを常に実行する機能があります。
FWKNOPは、UDPを介して送信される暗号化された単一のパケットに対して特定のポートへのアクセスを許可するiptablesルールを設定します。次に、許可後、許可されたユーザーに30秒などの一定時間アクセスを許可し、その後ポートを閉じて、接続を開いたままにします。
これまでの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
次に、サーバー側で、セットアップ後、:
/etc/default/fwknop-server
START_DAEMON="no"
からSTART_DAEMON="yes"
次に実行します:
Sudo service fwknop-server stop
Sudo service fwknop-server start
そのため、上記のように、Ubuntuリポジトリ(2.6.0-2.1build1)にある現在のバージョンは、正常なSPAでコマンドを実行できません。 OPの時点でこの機能が必要であるが、fwknopバージョン(2.6.8)でリリースされる場合、以下に記載されているとおりです。
https://github.com/mrash/fwknop/issues/172
そのため、今すぐ使用する必要がある場合は、CMD_CYCLE_OPEN
オプション。
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のチュートリアルコミュニティ)
ForceCommand オプションは、クライアントが要求しない限り、PTYなしで実行されます。その結果、実際にスクリプトを期待どおりに実行するシェルがありません。さらに、OpenSSH SSHD_CONFIG(5)のマニュアルページには次のように明記されています。
このコマンドは、ユーザーのログインシェルに-cオプションを指定して起動します。
つまり、ユーザーのログインシェルを無効にした場合、または/bin/false
のようなものに設定した場合、ForceCommandは機能しません。仮定して:
次に、適切なユーザー名とカスタムスクリプトへの完全修飾パス名で適切に変更されると、globalsshd_configファイルで次のように動作します。
Match User foo
ForceCommand /path/to/script.sh
私は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)
chmod +x logwatcher.python3
crontab -e
次に、この行をそこに書き、この後に保存します。
@reboot /home/YOURUSERNAME/logwatcher.python3 "/var/log/auth.log" "session opened for user" "/sbin/myscript.sh"
このスクリプトの最初の引数は監視するログファイル、および2番目の引数は検索対象の文字列です。 番目の引数は実行するスクリプトファイルに行が見つかったとき。
クラッシュした場合にスクリプトを起動/再起動するために、より信頼性の高いものを使用するのが最適です。