環境を設定し、ネットワークサーバーに比較的複雑なWebアプリケーションをインストールするためのシェルスクリプトがあります。
以前、私のスクリプトには、使用のために開発コンピュータからリモートサーバーに簡単にコピーできる「ブートストラップ」機能が組み込まれていました。スクリプトを配置するフォルダを作成してからスクリプトをコピーするには、ルートログインが必要でした。 。
このプロジェクトが成長するにつれて、私たちが依存しなければならない他のソフトウェアには、独自の設定スクリプトのための「sudo」環境(ルートログインの代わりに)が必要であることがわかりました。したがって、設定スクリプトをルート見積もりから使用に切り替えたいと思います。 sudo(特にこのスクリプトを他の人と共有し、rootを使用できないサーバー(Ubuntuなど)で動作させることができます)。
現在、私のブートストラップ機能は次のことを行います。
bootstrap()
{
INSTALL_DIR=/local/bin
SCRIPT=`basename $0`
echo "Copying script '${SCRIPT}' onto server: '${RHOST}' into '${INSTALL_DIR}'"
echo "(You need to login (as root) 2 times.)"
ssh root@$RHOST "umask 027; mkdir -p $INSTALL_DIR"
scp -p "$SCRIPT" root@$RHOST:/$INSTALL_DIR
echo "Done. Now login to the server and run the script as root."
exit
}
sudoを使用するように変換する方法がわかりません。 scpは、ファイルがあるフォルダに書き込むことができるユーザーとしてログインしたいと思います。ルートアカウントがないと、これはできません。
それとも、私はこれをあまりにも複雑にしていますか?リモートサーバーの一般ユーザーが本質的に1つのステップでルートを削除した場合は、これらの管理スクリプトを保存するための「きれいな」場所を作成するのではなく、自分のファイルスペース内の場所にscpできます。ユーザーはsudoを使用してそこからスクリプトのインストール部分を実行できます。 (発生する可能性のある唯一の問題は、他の管理者がスクリプトを実行しなければならず、他のユーザーのファイルにアクセスできない場合です)。
答え1
SSHに加えて、この問題を解決する方法はいくつかあります。それ以外にも、rootアカウントと「sudo」環境について少しあいまいです。ルートアカウントはシェルアクセス(Ubuntuのデフォルト)を許可せず、管理者権限を付与するにはユーザーにsudoアクセス権限を付与する必要があることを前提としています。ルートアカウント自体はまだ存在します(uid / gid 0)。
SSHとsudoに固執する
SSH、sudo、安全にファイルコピーを例にしてみましょう。ファイルを公開場所にコピーし、sudoを使用して制限付き場所にコピーまたは移動できます。ファイルは少なくとも一時的に公開場所にあるため、これはセキュリティにいくつかの影響を与えます。この問題のセキュリティ要素を軽減する方法もたくさんあります。
リモートサーバーの一時的な場所にファイルを安全にコピーします。
scp -p xfer_file jschaeffer@aiur:/tmp
SSHを使用してサーバーに接続し、それを永続的な場所にコピーまたは移動します。
ssh -t jschaeffer@aiur: sudo cp /tmp/xfer_file /perm
ここで重要なのはsshの-tです。マンページから。
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.
パスワードの入力を求められない
これに加えて、パスワードを必要とせずにユーザーにメッセージが表示されないようにsudoルールを定義できます。
root以外のユーザーがパスワードなしでrootに認証できるようにする
この方法の代替案は、公開鍵を使用することです。公開鍵を使用して、ユーザーに他のアカウントへのアクセス権を付与できます。これはセキュリティにも影響します。ユーザーにボックスへのフルルートアクセスを許可します(以下の簡単な情報を参照)。
jschaeffer@defiler:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/jschaeffer/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /jschaeffer/.ssh/id_rsa.
Your public key has been saved in /jschaeffer/.ssh/id_rsa.pub.
次に、公開鍵をリモートサーバーにコピーします(秘密鍵ではなく公開鍵をコピーする必要があります)。この完全な議論は、直接ルートアクセスを許可しないサーバーにファイルをコピーすることに関するものであるため、rootアカウントに接続されているssh-copy-idまたはscpコマンドは表示されません。それにもかかわらず、キーを〜root / .ssh / authorized_keysに転送する方法を見つける必要があります。上記の戦略を使用するか、フラッシュドライブまたは他の方法(rsync、ftpなど)にコピーすることができます。
ルートアカウントは、サーバーでパスワードのない認証を許可する必要があります。 /etc/ssh/sshd_configの設定が正しいことを確認してください。
# Authentication:
LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes
次に、ファイルをルートアカウントに直接コピーします。
scp -p xfer_file root@aiur:/perm_location
Authorized_keys ファイルにオプションを追加すると、SSH 接続時にユーザーが実際に実行できる操作を制限できます。
その他のオプション
もちろん、他のオプションもたくさんありますが、リストしません。
- Kerberosを使用してください。 Kerberosは、安全でないネットワークのセキュリティを中心に設計された完全なプロトコルです。もちろん、これには全体的な環境、メンテナンス、ハードウェアなどが必要ですが、望むものではないかもしれません。 SSH は Kerbero と統合するか、Kerberos の代わりに安全でないトランスポート 代替を使用できます。
- ファイルをサーバーの一時的な場所にコピーし、そのディレクトリのファイルを選択して永続的な場所に転送するリモートサーバーでrootとしてcronジョブを実行します。
- rsync ファイル
- 両方のサーバー(たとえば、ftp、sftp、http)にアクセスできる共通の場所にファイルを保存します。
- ルートアカウントを再度有効にします。
答え2
rsyncの場合、人々はパターンを使用してそれを実装します。ほとんどのLinuxインストールにはデフォルトでrsyncが含まれています。
rsync -e "ssh -t" --rsync-path="sudo rsync" ...
-https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Automated_Backup#Backup_with_rsync_and_sudo
答え3
簡単に書き込めない場所にデータをプッシュするのではなく、データをプルするのはどうですか?または、データを書き込むことができる他の場所にプッシュしてから、リモートシステムにデータを配置しますか? --おそらく、新しいファイルを取得するためにアプリが返送されたときですか?
さらに、いくつかの推奨事項は本番システムのセキュリティを弱めます。