sudoersファイルを正しく設定しようとしていますが、見つかった文書が役に立たないようです。
次のユーザーがいます。ユーザー1
2 台の Debian サーバーがあります。サーバー1そしてサーバー2。
現在、SSHを使用してWindows PCから2つのサーバーのいずれかに接続し、必要に応じてsudo
権限をエスカレートできます。
これから行けるはずですサーバー1到着サーバー2シェルスクリプトからファイルを実行します。サーバー2同様に、sudo
パスワードを入力する必要はありません(スクリプトまたは手動で)。
このファイルを使用してこれを行うことができることを知っていますsudoers
。
しかし、どうすればいいですか?
私のsudoers
ファイルに(サーバー2)私は持っています:
# User privilege specification
root ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
%user1 ALL=(ALL:ALL) ALL
私は次のことができることを知っています。
%user1 ALL = NOPASSWD: /path/to/myscript
これによりユーザー1スクリプトの実行/パス/to/mysqscriptパスワードは必要ありません。しかし、Windows PCから接続すると、スクリプトの実行以外の操作を実行できなくなりますか?
NOPASSWD
理想的には、この機能を次の接続に制限したいと思います。サーバー1。
ここで何か抜けましたか?私は自分自身を完全にロックしないように変更を「テスト」することを嫌がっています。
答え1
実際の答えを得る前に、1つの調整が必要です。 「%user1」を使用すると、「その人はグループuser1"; おそらく"user1"がuser1を意味することを望むでしょう。
第二に、sudoはあなたがどこにログインしたのかわかりません。~から- 現在sudoを実行している場合にのみ適用されます。
第三に、「visudo」を使用して変更する必要があります。これにより、構文エラーが発生するのを防ぎます。
第四に、sudoers行を追加すると、現在のアクセス権のみが増加します。そのスクリプトにsudoが必要な場合は、さらにsudoersエントリが必要です。
答え2
で接続する機能を制限する方法についてお問い合わせいただきましたserver1
。私はこれをしますssh
。変更されたユーザーコードはDebian / Ubuntuで動作します。これらの原則と他のほとんどの規則はかなり一般的でなければなりません。この構成を使用してserver2
fromからスクリプトを実行するには、server1
次のコマンドを実行します。
$ ssh -i ~/.ssh/script_identity.pub ruser@server2
上記のコマンドは、追加の介入や認証なしでserver2
スクリプトを接続して実行します。公開鍵ファイルは、スクリプトをリモートで実行できる唯一のファイルであるため、スクリプトにアクセスできるコンピュータおよび/またはアカウントを決定できます。ssh
sudo
ssh
server2
ssh
次の説明は、これらのタスクを実行するコードを示しています。
この設定には専用アカウントが必要ですserver2
。いくつかの理由があり、すでに述べたものの1つがロックされる可能性があります。server2
悪い場合は、仕事用アカウントで誤ったファイルを誤って修正することです。
ssh
制限付きリモートアクセスを設定するには
存在するserver1
- スクリプトを実行するアカウントで
server1
リモートスクリプトを実行するためにのみ使用する新しいSSHキーを作成します。 - 実行を1つのコマンドに限定するように新しいSSH公開鍵を変更します(
command=
マンページを参照sshd
)。 - ユーザーIDと日付を印刷するテストスクリプトを作成します。
オンserver2
(すべての操作がリモートで行われますserver1
)
- に新しいアカウントを作成してください
server2
。 - 変更した公開IDファイルを
.ssh/authorized_keys
新しいユーザーのホームディレクトリにコピーしますserver2
。 - テストスクリプトを新しいユーザーのホームディレクトリにコピーします
server2
。 - 新しいユーザーアカウントのすべてのファイルに対するすべての権限と所有権を確認してください。
パスワード
次のスクリプトruser.sh
を に保存し、そのスクリプトserver1
の機能を理解し、次のコマンドを実行して実行します。
$ sh ./ruser.sh ruser server2
このスクリプトをruser.sh
ユーザーアカウントに保存しますsystem1
。
#!/bin/sh -e
#
# ruser.sh -- setup user on remote host for secure remote script execution
#
# This is for first time setup!
# Always use a new user on remote host.
#
USAGE="ERROR: Usage: sh $0 remote-username remote-hostname"
RUSER="${1:?$USAGE}"
RHOST="${2:?$USAGE}"
UNIQUE=$$
# build files that will be transferred to the remote host
# Make the new ssh key, and modify the public key so that
# it can only be used to execute "./rscript.sh"
ssh-keygen -N '' -f ~/.ssh/script_identity
sed -i '1 {
s,command="./rscript.sh",,
s,^,command="./rscript.sh" ,
}' ~/.ssh/script_identity.pub
# rscript.sh -- the only script that can be executed
# with the modified public key.
printf '%s' '(id;date) > rscript.out' > /tmp/rscript.sh.$$
# copy the new identity public key and rscript.sh to the remote host
scp ~/.ssh/script_identity.pub "${RHOST}":/tmp/script_identity.pub.${UNIQUE}
scp /tmp/rscript.${UNIQUE} "${RHOST}":/tmp/script_identity.pub.${UNIQUE}
# setup remote user for script execution
# Create new user
# Move identity file and script to new user's home directory.
# Fix ownership and permissions
ssh -t ${RHOST} "sudo /bin/sh -cex '
adduser --system --shell=/bin/sh ${RUSER};
mkdir -m0700 ~${RUSER}/.ssh;
mv /tmp/script_identity.pub.${UNIQUE} ~${RUSER}/.ssh/authorized_keys;
mv /tmp/rscript.sh.${UNIQUE} ~${RUSER}/rscript.sh
chmod -R 0600 ~${RUSER}/.ssh/;
chmod 0700 ~${RUSER}/.ssh/;
chmod 0700 ~${RUSER}/rscript.sh;
chown -R ${RUSER}:nogroup ~${RUSER}/;
'
"
# remove temp files
rm -rf /tmp/rscript.sh.${UNIQUE}
次のコマンドを実行して上記の設定をテストしますserver1
。
$ ssh -i ~/.ssh/script_identity.pub ruser@server2
ruser
次に on のホームディレクトリを確認し、ファイルがserver2
実際rscript.out
に作成されたことを確認し、すべてが正しく設定されたことを示します。
その場合は、sudoersファイルを変更する前にsshコマンドを再度実行してリモートスクリプトを再実行して、出力とエラーの出力が目的のruser@server2:rscript.sh
方法/path/to/myscript
で機能していることを確認してください。
新しいユーザーがパスワードなしでrootとして1つのスクリプトしか実行server2
できないようにsudoersファイルを設定します。server2
ruser ALL = NOPASSWD: /path/to/myscript
おめでとうございます。これで、パスワードssh
やsudo
システムパスワードなしでリモートで特権スクリプトを安全に実行できるようになりました。