[Ubuntu] 04. SSH 서버 - (2)
카테고리: UBUNTU
🔔 SFTP 전용 + Chroot
SFTP 전용 + Chroot를 구성으로, 이 설정이 적용된 일부 사용자는 SFTP 및 chroot 디렉토리만 사용하여 액세스할 수 있습니다.
■ 예를 들어 [/home]을 Chroot 디렉터리로 설정
# SFTP 전용 그룹 만들기
$ groupadd sftp_users
# SFTP에 대해서만 사용자 [choi]에게 적용
$ usermod -aG sftp_users choi
$ vi /etc/ssh/sshd_config
# line 115 : 주석 처리하고 아래와 같이 한 줄을 추가
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
# 끝에 추가
Match Group sftp_users
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /home
ForceCommand internal-sftp
$ systemctl restart ssh
■ 사용자 설정 SFTP 전용 설정으로 작업하는지 확인
$ ssh choi@dlp.srv.test
choi@dlp.srv.test's password:
This service allows sftp connections only.
Connection to dlp.srv.test closed. # 정상적으로 거부됨
$ sftp choi@dlp.srv.test
choi@dlp.srv.test's password:
Connected to dlp.srv.test.
sftp>
🔔 SSH-Agent
SSH-Agent는 SSH 키 쌍의 비밀키를 안전하게 보관하고, SSH 접속 시 비밀키의 입력 없이 자동으로 접속을 가능하게 해주는 프로그램
-
SSH 접속 시, 보통 비밀키를 입력하여 인증을 해야하는데 이때 SSH-Agent를 사용하면, 한번 비밀키를 입력하여 SSH-Agent에 등록해놓으면 이후 SSH 접속 시 비밀키를 입력할 필요 없이 자동으로 인증이 가능하다.
-
SSH-Agent는 사용자가 로그인한 환경에서만 실행되며, 사용자가 로그아웃하면 SSH-Agent도 함께 종료됩니다. 따라서 SSH-Agent를 이용하여 비밀키를 등록하면, 해당 사용자가 로그인한 상태에서만 SSH 접속이 가능하다.
-
SSH-Agent를 사용하면, SSH 접속 시 비밀키를 반복해서 입력하는 번거로움을 해결할 수 있으며, 보안성도 높일 수 있다.
■ SSH 통신 과정
-
클라이언트가 서버에 연결 요청을 합니다.
-
서버는 클라이언트에게 공개키를 보냅니다.
-
클라이언트는 공개키를 사용하여 서버에 대한 암호화된 세션 키를 생성하고, 이를 서버에게 보냅니다.
-
서버는 자신의 비밀키를 사용하여 세션 키를 복호화합니다.
-
이제 서버와 클라이언트는 세션 키를 사용하여 암호화된 통신을 합니다.
이를 통해 중간에 탈취될 가능성이 있는 패스워드 등의 정보를 안전하게 전송할 수 있습니다.
■ SSH-Agent를 사용했을 때의 통신 과정
-
클라이언트가 서버에 연결 요청을 합니다.
-
서버는 클라이언트에게 공개키를 보냅니다.
-
클라이언트는 SSH-Agent에게 자신의 비밀키를 요청합니다.
-
SSH-Agent는 요청에 대해 인증된 비밀키를 제공합니다.
-
클라이언트는 SSH-Agent로부터 받은 인증된 비밀키를 사용하여 서버에 대한 세션 키를 생성하고, 이를 서버에게 보냅니다.
-
서버는 자신의 비밀키를 사용하여 세션 키를 복호화합니다.
-
이제 서버와 클라이언트는 세션 키를 사용하여 암호화된 통신을 합니다.
즉, SSH-Agent를 사용하는 경우, 클라이언트는 비밀키를 직접 사용하지 않고, SSH-Agent를 통해 비밀키를 요청하고, SSH-Agent는 인증된 비밀키를 제공하여 세션 키를 생성합니다. 이를 통해 비밀키가 클라이언트에게 노출되지 않으므로 더욱 안전한 SSH 통신이 가능합니다.
■ 클라이언트에서 SSH 키 쌍을 생성하고 공개 키를 서버에 복사
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa):
Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase): # PW 입력
Enter same passphrase again: # PW 다시 입력
Your identification has been saved in /home/test/.ssh/id_rsa
Your public key has been saved in /home/test/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:vxroT8IqL1BnisexijpZmOAJpZsJrLIlVxW9yDB3vHQ test@dlp.srv.test
The key's randomart image is:
+---[RSA 3072]----+
| .+ |
| . o o = E |
|.o * + + |
|=.o + o o |
|*X.B S |
|%oO . . . |
|o@ + o . |
|* o o o . . |
|o. +o ..o.. |
+----[SHA256]-----+
$ ssh-copy-id dlp.srv.test
■ 클라이언트에서 ssh-agent 를 시작하고 ssh-add 명령으로 키를 추가
# SSH-Agent 실행
$ eval $(ssh-agent)
Agent pid 1657
# 비밀번호 추가
$ ssh-add
Enter passphrase for /home/test/.ssh/id_rsa:
Identity added: /home/test/.ssh/id_rsa (test@dlp.srv.test)
# 등록된 SSH 키 확인
$ ssh-add -l
3072 SHA256:vxroT8IqL1BnisexijpZmOAJpZsJrLIlVxW9yDB3vHQ test@dlp.srv.test (RSA)
# SSH 접속
$ ssh dlp.srv.test hostname
dlp.test.srv
# SSH-Agent 종료
# 종료하지 않으면 로그아웃하여도 SSH-Agent 프로세스가 남아있을 수 있으니 주의
$ eval $(ssh-agent -k)
Agent pid 1657 killed
🔔 SSHPass
SSHPass는 클라이언트에서 서버로 ssh 접속 시 패스워드 요구 없이 할 수 있는 도구
- 클라이언트에서 키 생성(ssh-keygen)하여 서버로 배포(ssh-copy-id)하여, ssh, scp 수행 시 배치모드로 패스워드를 전달하거나 스크립트에 패스워드를 기재하여 접속이 가능하다.
■ SSHPass 설치
$ apt -y install sshpass
■ SSHPass 사용 방법
# [-p password]
$ sshpass -p 1234 ssh dlp.srv.test hostname
dlp.srv.test
# [-f file]
$ echo '1234' > sshpass.txt
$ chmod 600 sshpass.txt
$ sshpass -f sshpass.txt ssh dlp.srv.test hostname
dlp.srv.test
# [-e] : 환경변수로부터
$ export SSHPASS=1234
$ sshpass -e ssh dlp.srv.test hostname
dlp.srv.test
🔔 SSH Port Forwarding
SSH Port Forwarding은 SSH 연결을 통해 로컬 머신과 원격 서버 간의 네트워크 연결을 안전하게 전달하는 기술
■ 로컬 포트 포워딩(Local Port Forwarding)
-
로컬 머신에서 원격 서버로 연결을 전달하는 것으로 로컬 머신에서 실행 중인 어플리케이션을 원격 서버에서 실행 중인 어플리케이션과 안전하게 통신하도록 해줍니다.
-
예를 들어, 로컬 머신에서 웹 브라우저를 실행하고, SSH Port Forwarding을 사용하여 로컬 포트를 원격 서버의 웹 서버 포트에 매핑시켜서 웹 서버에 접속하는 경우가 있습니다.
■ 원격 포트 포워딩(Remote Port Forwarding)
-
원격 서버에서 로컬 머신으로 연결을 전달하는 것으로 원격 서버에서 실행 중인 어플리케이션을 로컬 머신에서 실행 중인 어플리케이션과 안전하게 통신하도록 해줍니다.
-
예를 들어, 원격 서버에서 실행 중인 데이터베이스에 로컬 머신에서 접속하기 위해서 SSH Port Forwarding을 사용하여 원격 포트를 로컬 머신의 데이터베이스 포트에 매핑시키는 경우가 있습니다.
■ 예시
- 예를 들어 [92.168.219.195]의 포트 [8081]에 대한 요청이 [192.168.219.191]의 포트 [80]로 전달되도록 SSH 포트 포워딩을 설정합니다.
# Source 호스트에서 대상 호스트로 SSH 로그인
[root@dlp ~]# ssh -L 192.168.219.195:8081:192.168.219.191:80 root@192.168.219.191
root@node01.test.srv's password:
[root@node01 ~]#
# 확인
[root@node01 ~]# ssh 192.168.219.195 "ss -napt | grep 8081"
root@192.168.219.195's password:
LISTEN 0 128 192.168.219.195:8081 0.0.0.0:* users:(("ssh",pid=2207,fd=4))
■ 확인
댓글 남기기