なぜ「require」が機能しないのですか?

なぜ「require」が機能しないのですか?

私が知る限り、このrequirettyオプションはPTYでsudoを使用することを許可しません。

私の仮想マシンsudoers

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults        passwd_tries=3
Defaults        badpass_message="WRONG PASSWORD T_T"
Defaults        log_input, log_output, iolog_dir="/var/log/sudo"
Defaults        requiretty
# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d`

SSHを介してシステムに接続すると、ttyプログラムが出力されます/dev/pts/0

ただし、SSHセッションではパスワードを使用してsudoを実行できます。このrequirettyオプションはSSHまたはPTYから独立していますか? SSHセッションでsudoを使用する方法は?

ベストアンサー1

あなたの理解が間違っています。擬似TTYは、「実際の」TTYとまったく同じと見なされます。

tty印刷されると、/dev/pts/0セッションに有効なTTYがあることを示します。

ただし、SSHプリファレンスを使用して仮想マシンに接続して実行するコマンドを指定すると、状況が異なります。

$ ssh VM-user@VM-hostname "hostname; tty"
VM-hostname
not a tty

そしてそれsudoオプションが拒否された場合ですrequiretty

TTY の要件により、SSH は、パスワードの要求時に他の多くの Unix プログラムが実行するように、標準入力を介してパスワードプロンプトへの応答をパイプしようとすることを拒否できます。

また、次のことができます。

sudo -u some-user data_producing_command 2> error-log-file | data_consuming_command

パイプされるデータdata_consuming_commanderror-log-filedata_consuming_commandsome-user

つまり、 set の場合、次のコンテキストでは使用requirettyできません。sudo

  • ssh VM-user@VM-host sudo somethingTTY 割り当てを強制しないと、失敗した SSH を介したリモートコマンドはssh -tt VM-user@VM-host sudo something成功します。
  • crontabコマンドまたはcrontabを介して実行されるスクリプトatまたはbatchコマンド
  • スクリプトは次のように実行されます。nohup
  • ユーザーセッションに関連付けられていない他のデーモンを介してcgi-bin実行されるスクリプト

requirettyパスワードを設定して要求すると、パスワードsudoがどのように実行されるかは、概念上、次のスクリプトとほぼ同じです。

printf "[sudo] password for $USER: " > /dev/tty  # display prompt

TTYSETTINGS=$(stty -F /dev/tty --save)  # save current TTY settings
stty -F /dev/tty -echo -echoe           # prevent displaying the password

read PASSWORD < /dev/tty  

stty -F /dev/tty $TTYSETTINGS           # restore TTY settings 
# now check if $PASSWORD is correct...

/dev/ttyセッションにTTYがある場合は、常にセッション内の実際のTTYデバイスのエイリアスとして機能する「魔法の」デバイスです。まさにこれをするために存在します。すべてのスクリプトまたはプログラムがパイプまたは他の入力/出力リダイレクトを「エスケープ」できるようにし、必要に応じてユーザーと直接対話できるようにします。

requiretty設定されていて使用できない場合/dev/tty(つまり、プロセスに接続されている実際のTTYがない場合)は、パスワード認証の失敗として扱われます。

おすすめ記事