SSHを介してプライベートストアを設定しようとしています。マイsources.list.d/
インクルージョン
deb ssh://user@host:/repo ./
ユーザーはホストの証明書専用アカウントです。apt-get update
うまくいきます。
しかし、ダウンロードリポジトリへのアクセスを制限したいと思います。つまり、シェルアクセスを無効にしたいのです。ユーザーシェルをrsshに設定してscpとsftpのみを許可すると、更新は中止されます。
から/var/log/syslog
:
user user attempted to execute forbidden commands
command: /bin/sh
aptがストレージシステムへのシェルアクセスを必要とするのはなぜですか。これを防ぐ方法はありますか?
私はapt-transport-sftpのgithubリポジトリがあることに気づき、見てみましょうが、ユーザーの便宜のためにより一般的なパッケージを使用することをお勧めします。
答え1
APTはリモートで何をしますか?
テストアカウントを設定し、apt
単純なスクリプトを使用して、リポジトリ所有者のシェルの代わりにリモートサーバーで実行されているすべてのコマンドを記録しました。apt
よく知られているファイルのフルパスを見つけるためにリモートシェルが作成されるようです::
2015-09-14: Executing 'sh -c /bin/sh'; input and output follows:
find /tmp/repo/./InRelease -follow -printf '%s\n' 2> /dev/null || echo
find /tmp/repo/./Release.gpg -follow -printf '%s\n' 2> /dev/null || echo
find /tmp/repo/./Release -follow -printf '%s\n' 2> /dev/null || echo
find /tmp/repo/./Packages.bz2 -follow -printf '%s\n' 2> /dev/null || echo
find /tmp/repo/./it_CH.bz2 -follow -printf '%s\n' 2> /dev/null || echo
find /tmp/repo/./it.bz2 -follow -printf '%s\n' 2> /dev/null || echo
find /tmp/repo/./en.bz2 -follow -printf '%s\n' 2> /dev/null || echo
find /tmp/repo/./Packages.xz -follow -printf '%s\n' 2> /dev/null || echo
...
したがって、repoユーザーが実行できる操作に制限を渡すことはできないと思います
rssh
。 (1)実行されるコマンドはSTDINを介してリモートシェルに渡され(SSHのリモート実行機能とは対照的)、(2)コマンドはシェルパイプです。
解決策?
ストレージユーザーがリモートで実行できる操作を制限したい場合は、次の2つの方法があると思います。
repo ユーザーのシェルを次に設定します。 rbash 代わりに、
$PATH
実行する必要があるコマンドのみを含むカスタム設定を提供してください。 (必ず設定してください$PATH
(ファイルは次の場所から始めてください))できないストレージユーザーからの書き込み。 )それでもアクセス資格情報を持っている人は誰でもシステム上のすべてのファイルを読むことができる可能性があります。ストレージファイルとAPTに必要なすべてのコマンドでchroot刑務所を作成し、ストレージユーザーのシェルを実行するスクリプトまたはプログラムに設定します
chroot /jail "$@"
。
記録apt-get update
操作
リモートで行われた操作を記録するために使用するスクリプトは次のとおりです。
#!/bin/sh
echo "$(date -I): executing 'sh $@'; input and output follows" >> /tmp/sh.log
tee -a /tmp/sh.log | /bin/sh "$@" | tee -a /tmp/sh.log
答え2
これを避ける方法はありません。
デフォルトのsshメソッドを使用するには、リモートapt
サーバーにログインし、シェルアクセスを取得するために呼び出し、いくつかのタスクを実行するためにいくつかの/bin/sh
GNUユーティリティ(たとえば)を使用する必要があります。find
dd
これ適切なソースコードこれを確認しました:
157 Args[i++] = "/bin/sh";
158 Args[i] = 0;
159 execvp(Args[0],(char **)Args);
160 exit(100);
(驚くべきことに、廃止とマークされたwithオプションをapt
まだ使用しています)find
-follow