왜 "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-file.data_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가 없는 경우) 비밀번호 인증 실패로 처리됩니다.

관련 정보