Server에 어떻게 접속하나요?
특별히 사용하는 도구나 방법이 있을까요?
질문의 의도가 무엇일까?
- ssh를 알고 있는가?
- ssh를 사용해 보았는가?
- 사용하는 OS가 무엇인지?
- 평소에 Ubuntu 같은 리눅스 기반 OS를 사용하는지?
- ssh의 원리를 알고 있는지?
- password가 아닌 key pair 방식을 사용해 보았는지?
- 사용하는 도구를 알고 있는지?
실제로 ssh 에 접속하는 방법은 알고 있지만
원리가 어떻게 되고,
어떻게 사용자를 추가하게 되고,
Public Key, Private Key 가 사용되는 원리까지 알아야 좋다.
더 나아가서는 접근제어를 어떻게 관리하는지에 대한 질문도 받을 수 있다.
평소에 쿠버네티스를 공부하면서 Virtual Box나 ec2 인스턴스 같은 리눅스 OS는 매일 사용한다.
그래서 항상 ssh로 터미널을 연결해서 썼지만,
이제서야 ssh의 정확한 원리에 대해서 알아보려고 한다.
ssh 연결
내 VM의 사설 IP는 192.168.56.102 이다.
ssh master@192.168.56.102
master@192.168.56.102's password:
ssh를 연결을 시도하면 password를 묻고 password를 입력하면 아래처럼 접속이 완료된다.
ssh master@192.168.56.102
ssh 명령어를 보면 아무런 옵션도 없고, 그냥 username과 IP만 존재한다.
사실 반드시 있어야 하는건 포트 옵션 (-p)이다.
위 명령어는 ssh master@192.168.56.102 -p 22 와 동일한 뜻이다.
일반적으로 22번 포트는 ssh 연결에 쓰이기 때문에 -p 22가 default 값으로 지정되어있다.
22번처럼 일반적으로 많이 쓰이는 포트는 well-known 포트라고 해서 다른 용도 사용을 암묵적으로 금지한다.
ssh 포트 변경
물론 22번 포트말고 다른 포트로 ssh연결을 하고 싶을수도 있다.
sudo -i
현재 계정을 root 계정으로 바꾼다.
password가 필요하다.
vi /etc/ssh/sshd_config
sshd_config 파일에 접속한다.
파일에서 Port 22라고 적힌 부분을 수정해주고,
(1024 이상의 포트 번호를 선택하자)
sshd_config 파일
# $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
# 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.
Include /etc/ssh/sshd_config.d/*.conf
#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 prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes
# Expect .ssh/authorized_keys2 to be disregarded by default in future.
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
#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
# some PAM modules and threads)
ChallengeResponseAuthentication no
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
# 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 yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
PasswordAuthentication yes
Port xx
SSH 서비스 포트는 22로 규약되어 있지만 보안을 위해 임의의 포트로 변경 하는것도 가능하다. 원하는 포트번호로 변경하고 /etc/services 파일에서 ssh 포트값도 변경해 주면 된다.
ListenAddress 0.0.0.0
SSH 서버에서 Listen 할 로컬 호스트 주소를 설정하는 것이다.
여러개의 IP를 사용중일 때 특정 IP로 SSH 접속이 가능토록 설정하는 옵션으로,
0.0.0.0은 모든 네트워크를 의미한다.
사용하고자 하는 특정 IP가 있다면 0.0.0.0 대신 적으면 된다.
#Hostkey ~
Protocol 1, 2(rsa, dsa) 의 호스트키 위치를 지정한다.
LoginGraceTime 2m
지정한 시간내에 로그인 하지 않으면(2분) 자동으로 접속을 끊는다. 0이면 무제한.
-공개키인증
PubkeyAuthentication yes
-root 패스워드 로그인 금지하고 공개키 인증으로만 로그인
PermitRootLogin without-password
-root로는 아예 SSH로그인을 할 수 없다. (추천사항)
PermitRootLogin no
공격자가 임의의 주소에 root 계정으로 접속이 가능한지 여부를 무한 스캐닝을 통해 알아 낼 수 있다. 따라서 위와 같이 root 계정의 접근을 막고 일반 유저로 접속한 다음 root 계정을 불러오는 것이 좋다.
-패스워드로는 아예 로그인 못하게 설정
PasswordAuthentication no
-지정한 사용자만 SSH로 로그인 가능하게 설정
AllowUsers mysshuser
StrictModes yes
로그인을 허용하기 앞서 파일 모드 및 사용자 홈 디렉토리 소유권과 원격 호스트의 파일들을 ssh 데몬이 체크 할 수 있도록 할 때 사용.
MaxAuthTries 6
접속당 최대 인증 시도 횟수. 기본값 6, 3회이상 인증 실패시 로그가 기록된다.
#PubkeyAuthentication yes
공개키 인증 설정. Protocol 2에 적용된다.
IgnoreUserKnownHosts yes
RhostsRSAAuthentication, HostbasedAuthentication 인증시 ~/.ssh/knownhosts 파일의 호스트들을 제외할 것인지 설정한다. rhosts 파일을 허용하지 않았으므로 yes로 설정.
IgnoreRhosts yes
~/.rhosts와 ~/.shosts 파일 사용여부를 결정한다. 보안상 이유로 사용하지 않는다.
PasswordAuthentication yes
패스워드 인증을 허용한다. Protocol 1, 2 모두 적용된다.
ChallengeResponseAuthentication no
Challenge-Response 인증을 허용할지 여부를 설정한다. UsePAM 옵션을 yes로 설정할 경우 이 옵션은 no로 설정해야 한다.
#UsePAM yes
ChallengeResponseAuthentication을 이용한 PAM 인증을 허용하는 옵션이다. 이 옵션을 yes로 설정하는 경우 열쇠글 인증과 동일하게 적용되므로, 열쇠글 인증 또는 ChallengeResponseAuthentication 옵션을 꺼 놓아야 한다.
- Kerberos 및 GSSAPI 인증에 관한 내용은 필요에 따라 설정.
AllowTcpForwarding yes
TCP 포워딩을 가능토록 설정하는 옵션이다.
GatewayPorts no
클라이언트에 포워드된 포트로 원격 호스트 들이 접속할 수 있도록 설정하는 옵션이다.
X11Forwarding no
원격에서 X11 포워딩을 허용할지 여부를 설정하는 옵션이다.
#X11DisplayOffset 10
X11 포워딩이 될 때 디스플레이 offset을 설정. 허용하지 않았으므로 주석 처리.
PrintMotd yes
ssh 로그인시 /etc/motd 파일의 내용을 보여줄 것인지 여부결정. ssh 로그인을 환영하는 메시지나 공지사항 등을 출력되도록 할 수 있음.
PrintLastLog yes
로그인시 지난번 로그인 기록을 보여줄 것인가를 설정.
TCPKeepAlive yes
클라이언트의 접속이 끊어졌는지를 체크하기 위해 서버가 일정시간 메시지를 전달한다.
PermitUserEnvironment no
~/.ssh/enviroment와 ~/.ssh/authorized_keys 파일의 environment = 옵션을 sshd 데몬에서 처리 되도록 할것 인가를 설정한다.
Compression delayed
압축 사용여부를 결정.
ClientAliveInterval 0
클라이언트로부터 sshd 데몬이 아무런 데이터를 받지 못하게 되면 암호화된 채널을 통해서 메시지를 클라이언트의 요청에 응답하여 보내는데 이 때의 시간 간격을 초단위로 설정한다. 0은 클라이언트에 메시지를 보내지 않는 것을 의미. Protocol 2에서 적용된다.
ClientAliveCountMax 3
서버에게 전달되는 클라이언트의 생존 메시지 회수를 지정한다. 이 옵션으로 지정한 값에 도달하게 되면 sshd 데몬은 클라이언트와의 연결을 끊어 버리고 세션을 종료시킨다.
UseDNS yes
클라이언트 호스트 주소를 DNS 해석.
PidFile /var/run/sshd.pid
sshd 데몬의 PID를 저장할 파일을 지정한다.
MaxStartups 5
로그인하고 있지 않는 최대 접속 수를 설정한다. 이 값을 초과하게 되고 인증이 성공적으로 이뤄지지 않으면 그 다음 접속이 불가능 하다.
Subsystem sftp /usr/libexec/openssh/sftp-server
sftp는 프로토콜 버전 2에서 사용되는 것으로서 ssh와 같이 ftp의 보안을 강화하기 위해 사용되는 보안 ftp 프로그램이다. openssh를 설치하면 /usr/local/ssh/libexec/sftp-server파일이 설치된다. 이것은 sftp 서버용 프로그램으로 클라이언트 sftp프로그램은 설치되지 않는다.
따라서 서버로 가동시키고 원도용 ssh클라이언트 프로그램이나 SSH2를 설치하면 sftp를 사용이 가능하다.
UsePrivilegeSeparation yes
접속된 프로세스에 대해 상위 권한 없이 chroot로 고립된 형태로 작동
vi /etc/services
services 파일에 접속해서 포트 번호만 변경해준다. (tcp 변경 금지)
ssh 연결 원리
서버가 공개키를 가지고, 클라이언트가 비밀키를 가진다.
RSA 방식.
1. 서버 인증 및 세션 키 생성
접속하려는 서버가 올바른 서버인지 검증하고, 이후의 데이터 통신을 안전하게 진행하기 위한 세션 키를 생성하는 과정이다.
- 접속 요청을 받은 서버는 클라이언트에게 자신의 공개키를 전송한다.
- 최초 접속이라면, 서버로부터 전달받은 공개키를 로컬에 저장할 건지 물어볼 것이다.
- 동의한다면 해당 공개키가 클라이언트 홈 디렉토리의 .ssh/known_hosts 파일 안에 추가된다. (윈도우라면 C:/Users/{이름}/.ssh 폴더)
- 이후부터는 해당 서버에 접속 요청을 할 때마다 서버의 공개키가 로컬에 저장되어 있는 공개키와 같은 것인지 검증하게 되며, 같다면 올바른 서버로 판단하게 된다. (클라이언트 인증 과정)
- 이 과정에서, 통신 시 암호화 및 복호화를 위해 사용될 대칭키 (= 세션키) 가 생성된다.
2. 클라이언트 인증
클라이언트가 해당 서버에 대한 올바른 접근 권한을 가지고 있는지 검증하는 과정이다.
클라이언트 인증에는 아래의 두 가지 방식이 있다.
- Password 인증
⇒ 보안 상 취약하여 권장되지 않는 방식이다. - SSH 공개키 인증
⇒ 권장되는 인증 방식이다. 인증 절차는 다음과 같다.
클라이언트 측에서 Key Pair를 생성하고 서버에 공개키를 전송하는 작업은 이미 완료한 상태라고 가정한다.
-
- 클라이언트는 해당 서버에 접속하기 위해 사용할 Key Pair의 ID를 서버에 전송한다.
- 서버는 해당 ID에 매칭되는 공개키가 홈 디렉토리의 .ssh/authorized_keys 파일 안에 작성되어 있는지 찾는다.
- 존재한다면, 랜덤 스트링(Random Challenge Message)을 생성하고 이를 해당 공개키로 암호화하여 클라이언트에 전송한다.
- 클라이언트는 전달받은 암호화된 스트링을 비밀키로 복호화한다.
- 이후 복호화한 스트링을 이용하여 해시 값을 계산하고, 이를 다시 서버에 전송한다.
- 서버도 생성했던 스트링을 이용하여 해시 값을 계산하고, 클라이언트로부터 받은 값과 같은지 검사한다.
- 같다면, 올바른 클라이언트임이 인증되어 데이터 통신이 가능해진다.
SSH 연결 과정 요약
접속 시 생성한 대칭키 (= 세션키) 를 이용하여 서로 데이터를 주고 받으며 통신한다.
클라이언트가 보낼 때는 대칭키로 암호화하고, 받을 때는 대칭키로 복호화하는 방식이다.
통신이 종료되면 (= SSH 세션이 종료되면) 해당 대칭키는 폐기되며,
다시 접속할 때마다 새로운 대칭키가 생성되어 통신에 사용된다.
당연히 대칭키, 공개키, 비밀키 간의 차이점을 알아야 합니다.
'DevOps > Linux' 카테고리의 다른 글
[Linux] 웹사이트 동작 체크 명령어는? (0) | 2022.04.10 |
---|---|
Ubuntu IP 설정하기 (Virtual Box) (0) | 2022.03.13 |
Linux - GCC/Make (0) | 2021.04.22 |