"requiretty"가 작동하지 않는 이유는 무엇입니까?

"requiretty"가 작동하지 않는 이유는 무엇입니까?

requiretty이 옵션은 PTY에서 sudo를 허용하지 않는다는 것을 알고 있습니다 .

내 VM 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 기본 설정을 사용하여 VM에 연결하고 실행할 명령을 지정하면 상황이 달라집니다.

$ 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-file. ( data_consuming_command여기에서는 가 아닌 자신으로 실행됩니다 some-user!)

즉, set을 사용하면 다음 과 같은 상황에서는 requiretty사용할 수 없습니다 .sudo

  • TTY 할당을 강제하지 않는 한 SSH를 통한 원격 명령은 ssh VM-user@VM-host sudo something실패하지만 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가 없는 경우) 비밀번호 인증 실패와 동일하게 처리됩니다.

관련 정보