sshd_config의 SSH 클라이언트 활동 간격 문제

sshd_config의 SSH 클라이언트 활동 간격 문제

현재 우리 프로젝트에서는 SSH를 사용하고 있으며 1분 동안 활동이 없으면 SSH 사용자를 로그아웃하는 기능을 구현해야 합니다. 다음은 ssh_config 및 sshd_config 파일에서 발췌한 내용입니다.

ssh_config


# This is the ssh client system-wide configuration file.  See
# ssh_config(5) for more information.  This file provides defaults for
# users, and the values can be changed in per-user configuration files
# or on the command line.

# Configuration data is parsed as follows:
#  1. command line options
#  2. user-specific file
#  3. system-wide file
# Any configuration value is only changed the first time it is set.
# Thus, host-specific definitions should be at the beginning of the
# configuration file, and defaults at the end.

# Site-wide defaults for some commonly used options.  For a comprehensive
# list of available options, their meanings and defaults, please see the
# ssh_config(5) man page.

Host *
  ForwardAgent yes
  ForwardX11 yes
#   RhostsRSAAuthentication no
#   RSAAuthentication yes
#   PasswordAuthentication yes
#   HostbasedAuthentication no
#   GSSAPIAuthentication no
#   GSSAPIDelegateCredentials no
#   BatchMode no
#   CheckHostIP yes
#   AddressFamily any
#   ConnectTimeout 0
#   StrictHostKeyChecking ask
#   IdentityFile ~/.ssh/id_rsa
#   IdentityFile ~/.ssh/id_dsa
#   IdentityFile ~/.ssh/id_ecdsa
#   IdentityFile ~/.ssh/id_ed25519
#   Port 22
#   Protocol 2
#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
#   MACs hmac-md5,hmac-sha1,[email protected]
#   EscapeChar ~
#   Tunnel no
#   TunnelDevice any:any
#   PermitLocalCommand no
#   VisualHostKey no
#   ProxyCommand ssh -q -W %h:%p gateway.example.com
#   RekeyLimit 1G 1h
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

sshd_conf


# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
#PermitEmptyPasswords no
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
Compression no
ClientAliveInterval 15
ClientAliveCountMax 4
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# override default of no subsystems
Subsystem       sftp    /usr/libexec/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server

sshd_config_read-only


# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::


# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
Compression no
ClientAliveInterval 1m
ClientAliveCountMax 0
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# override default of no subsystems
Subsystem       sftp    /usr/libexec/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server
HostKey /var/run/ssh/ssh_host_rsa_key
HostKey /var/run/ssh/ssh_host_ecdsa_key
HostKey /var/run/ssh/ssh_host_ed25519_key

sshd_config 파일에서 변경한 내용은 다음과 같습니다.

ClientAliveInterval 1m
ClientAliveCountMax 0

ClientAliveInterval을 1분으로 설정하고 ClientAliveCountMax를 0으로 설정한 후 사용자가 1분 동안 활동이 없으면 로그아웃할 것으로 예상합니다. 그런데 사용자가 로그아웃할 수 없는 문제가 있습니다.

이것이 출력이다sshd -T && echo OK

addressfamily any
listenaddress [::]:22
listenaddress 0.0.0.0:22
usepam yes
logingracetime 120
x11displayoffset 10
maxauthtries 6
maxsessions 10
clientaliveinterval 0
clientalivecountmax 3
streamlocalbindmask 0177
permitrootlogin yes
ignorerhosts yes
ignoreuserknownhosts no
hostbasedauthentication no
hostbasedusesnamefrompacketonly no
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no
challengeresponseauthentication no
printmotd yes
printlastlog yes
x11forwarding no
x11uselocalhost yes
permittty yes
permituserrc yes
strictmodes yes
tcpkeepalive yes
permitemptypasswords no
compression no
gatewayports no
usedns no
allowtcpforwarding yes
allowagentforwarding yes
disableforwarding no
allowstreamlocalforwarding yes
streamlocalbindunlink no
fingerprinthash SHA256
exposeauthinfo no
pidfile /var/run/sshd.pid
xauthlocation /usr/bin/xauth
ciphers [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
macs [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1
banner none
forcecommand none
chrootdirectory none
trustedusercakeys none
revokedkeys none
securitykeyprovider internal
authorizedprincipalsfile none
versionaddendum none
authorizedkeyscommand none
authorizedkeyscommanduser none
authorizedprincipalscommand none
authorizedprincipalscommanduser none
hostkeyagent none
kexalgorithms curve25519-sha256,[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256
casignaturealgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,[email protected],ssh-ed25519,[email protected],rsa-sha2-512,rsa-sha2-256
hostbasedacceptedkeytypes [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,[email protected],ssh-ed25519,[email protected],rsa-sha2-512,rsa-sha2-256,ssh-rsa
hostkeyalgorithms [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,[email protected],ssh-ed25519,[email protected],rsa-sha2-512,rsa-sha2-256,ssh-rsa
pubkeyacceptedkeytypes [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,[email protected],ssh-ed25519,[email protected],rsa-sha2-512,rsa-sha2-256,ssh-rsa
rdomain none
loglevel VERBOSE
syslogfacility AUTH
authorizedkeysfile .ssh/authorized_keys
hostkey /etc/ssh/ssh_host_rsa_key
hostkey /etc/ssh/ssh_host_ecdsa_key
hostkey /etc/ssh/ssh_host_ed25519_key
setenv TMOUT=60
authenticationmethods any
subsystem sftp /usr/libexec/sftp-server
maxstartups 10:30:100
permittunnel no
ipqos af21 cs1
rekeylimit 0 0
permitopen any
permitlisten any
permituserenvironment no
pubkeyauthoptions none
OK

이 문제의 원인에 대한 통찰력이나 제안을 주시면 감사하겠습니다.

감사합니다!

답변1

ClientAlive*아니요정상적인 연결을 종료하도록 설계되었습니다. 그것은 신화이다. 읽어주세요내 다른 답변이러한 옵션이 실제로 어떤 역할을 하는지 알아보세요. 즉, 다음을 위한 것입니다.

  • 클라이언트가 네트워크에서 조용히 사라지는 경우 SSH 서버가 이를 감지할 수 있습니다.
  • 서버와 클라이언트 사이의 네트워크 노드가 유휴 상태로 인해 끊어지지 않도록 유휴 상태의 정상 연결을 업데이트합니다.

필요한 옵션은 ChannelTimeout및 입니다 UnusedConnectionTimeout. 이는 비활성을 감지하도록 설계되었습니다(클라이언트 실종 감지와 반대 ClientAlive*).

ChannelTimeout
sshd(8)비활성 채널을 빠르게 닫을지 여부와 방법을 지정합니다 . 시간 초과는 공백으로 구분된 하나 이상의 쌍으로 지정됩니다 type=interval. 이는 type특수 키워드 global이거나 아래 목록의 채널 유형 이름이어야 하며 선택적으로 와일드카드를 포함해야 합니다.

(원천)

UnusedConnectionTimeout
sshd(8)열려 있는 채널이 없는 클라이언트 연결을 빠르게 닫을지 여부와 방법을 지정합니다 . […]

이 시간 초과는 클라이언트 연결이 사용자 인증을 완료할 때 시작되지만 클라이언트가 채널을 열 기회가 생기기 전에 시작됩니다. 짧은 시간 초과 값을 사용할 때는 클라이언트가 연결을 종료하기 전에 채널을 요청하고 열 수 있는 충분한 시간을 제공하지 못할 수 있으므로 주의해야 합니다.

(원천)

다음은 설정 예입니다( /etc/ssh/sshd_config).

ChannelTimeout *=1m
UnusedConnectionTimeout 1m

노트:

  • ChannelTimeout *=1m와 같지 않습니다 ChannelTimeout global=1m.

  • 클라이언트는 사용자 활동(예: 사용자가 실행할 수 있는 대화형 셸 세션 등 watch date)을 쉽게 생성할 수 있습니다.

  • 서버가 어떤 이유로 마지막 채널을 종료하는 경우 ChannelTimeout일반적으로 클라이언트는 자체적으로 전체 연결을 종료하므로 UnusedConnectionTimeout문제가 되지 않습니다. 클라이언트의 일부 옵션(예: )으로 인해 클라이언트가 관련되기 ControlPersist전에 채널 없이 연결을 유지하려고 할 수 있습니다 .UnusedConnectionTimeout

  • 결과 패킷은 ClientAlive*어떤 채널에도 속하지 않으므로 시간 초과가 재설정되지 않습니다. 즉, 원하는 작업에 ChannelTimeout+를 사용할 수 있지만 설계된 목적에 사용할 수도 있습니다. ( 당신이 했던 것처럼 0으로 설정하면 이 기능이 비활성화됩니다.)UnusedConnectionTimeoutClientAlive*ClientAliveCountMax

  • ChannelTimeoutUnusedConnectionTimeout비교적 새로운 발명품 입니다 (OpenSSH 9.2, 2023-02-02). 이러한 옵션 이전의 온라인 리소스는 다른 수단을 통해 유사한 결과를 얻으려고 시도하며, 그 중 일부는 ClientAlive*신화를 사용하고 전파합니다.

  • 일반적으로 StopIdleSessionSec=유용 할 수도 있습니다 /etc/systemd/logind.conf. SSH에만 해당되는 것이 아니라 시스템 로그인 관리자에 해당됩니다. 바라보다 man 5 logind.conf.

답변2

사용자가 bash 쉘을 가지고 있다고 가정하고 다음을 추가하십시오 sshd_config.

SetEnv TMOUT=60

프롬프트에서 1분 동안 활동이 없으면 대화형 셸이 종료됩니다.

이는 사용자가 자신의 시간 초과 값을 조정할 수 있는 환경 변수일 뿐입니다. 하지만 특히 비밀번호로 로그인할 때는 꽤 힘든 시간입니다. 틀림없이,

sleep 300

커피를 마신 후에도 터미널이 여전히 활성 상태인지 확인하는 것은 유용하지만 사용자가 여러 화면에서 작업하는 등 일반적인 사용 사례에서는 작동하지 않습니다.

많은 동시성을 기대하지 않는 한게으른사용자(왜?) 저는 사용성을 먼저 생각합니다. 100만 번의 로그아웃이 사용자를 짜증나게 하기 위해서가 아니라 정말 필요한가요?

관련 정보