私のローカルコンピュータには、毎晩リモートサーバーにファイルをコピーするように設計されたスクリプトがあります。現在スクリプトが動作する唯一の方法であるため、パスワードのないキーを使用してscpを介してこれを行います。
スクリプトがクライアントコンピュータで実行されています。私に加えて、複数の人がこのマシンにアクセスできます。リモートマシンは私に属するクラウドインスタンスです。何も起こらないと予想されますが、安全に過ごすことをお勧めします。したがって、自分のローカルコンピュータにアクセスできる人は、誰もが自分のクラウドコンピュータにアクセスできないように、スクリプトが自動的に安全に機能することを望みます。
私はこのように永遠に続行したくありません。なぜなら、それは非常に安全ではないからです。しかし、タスクを実行するための安全なソリューションが見つかりませんでした。 Rcloneを調べてみましたが、マシンを同じ保護されていないままにしているようです。
問題を最も安全に解決するための最善の方法は何ですか?私はリモートで特定のユーザーを作成し、ファイルをコピーするフォルダにのみアクセスを制限したいと思いましたが、とにかくキーを使ってそのフォルダに自由にアクセスできます。
答え1
デフォルトでは、クライアントとサーバーをできるだけ分離する必要があります。お客様の説明によれば、サーバーはシンクの役割のみを実行するため、アクセスを書き込み専用にする方法を探していることに注意してください。 。
SSHを使用するには、そのForceCommand
オプションを使用し、入力をサーバー上の適切なファイルにパイプするフィルタスクリプトとして設定できます。詳細については。およびマニュアルページをcommand="command"
参照してください。AuthorizedKeysFile
sshd(8)
sshd_config(5)
代替案は、アップロードのみを許可する単純なREST APIです。 HTTPを選択した場合、デフォルトでリクエスト方法ハンドラーのみ:(POST
またはPUT
特定の設定に従って)。認証に証明書を使用します(有効期間が短く、可能であれば特定のソースシステムに接続することをお勧めします)。
答え2
あなたの答えはを使用することですsftp
。これは接続を介しても行われるため、現在実行中の作業とは大きく異なりませんssh
。
sftpは、暗号化されたSSH(1)転送を介してすべての操作を実行するftp(1)に似たファイル転送プログラムです。また、公開鍵認証や圧縮などのSSHの多くの機能を使用することもできます。
まず、クライアント用に別々のユーザーを作成する必要があります。ルートが所有するホームディレクトリ、公開鍵、および.ssh/authorized_keys
書き込みアクセス用の独自のディレクトリが必要です。
$ sudo mkdir -p /home/tmpuser/.ssh
$ sudo mkdir -p /home/tmpuser/uploads
$ sudo cp ~/.ssh/id_rsa.pub /home/tmpuser/.ssh/authorized_keys
$ sudo adduser --home /home/tmpuser --disabled-password tmpuser
$ sudo chown tmpuser /home/tmpuser/uploads
同じパスワードのないSSHトークンを使用できます。お客様が秘密鍵を他のユーザーと共有することを心配しているとします。この「他人」は、クライアントユーザーに属するコンテンツだけを見ることができ、他のユーザーやコンピュータの残りの部分に属するコンテンツは見ることができません。それはあなたの危険ではなく、彼らの危険です。uploads/
新しいファイルを監視してchrootから移動したり、処理後にファイルを削除したりすると、この問題を軽減できます。明らかに、着信ファイルを「信頼」しないでください(つまり、絶対に実行しないでください)。
次に、このユーザーが次のことを行うように/etc/ssh/sshd_config
設定して強制します。internal-sftp
#Subsystem sftp /usr/lib/openssh/sftp-server <-- comment this line out
Subsystem stfp internal-sftp
# At the bottom of the file add this:
Match User tmpuser
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory %h
それでは、sshd
リセットを使って次のことをsudo systemctl restart sshd
試してみてください。
# Confirm normal ssh is impossible
$ ssh tmpuser@localhost
This service allows sftp connections only.
Connection to localhost closed.
# Confirm scp is impossible
$ scp testfile tmpuser@localhost:
This service allows sftp connections only.
# Check that you can "put" a file in uploads/
$ echo "put testfile uploads/" | sftp -b - tmpuser@localhost
sftp> put testfile uploads/
# Check that you can connect via sftp and can only use sftp commands
$ sftp tmpuser@localhost
Connected to localhost.
# Check that a basic command works
sftp> ls
uploads
# Check that we are indeed in a chroot
sftp> pwd
Remote working directory: /
# Check that our testfile was actually uploaded
sftp> ls uploads
uploads/testfile
# Try to get out of the chroot
sftp> cd ..
sftp> ls
uploads
# Try to run a non-sftp command
sftp> ps
Invalid command.