[Rocky] 04. SSH 서버 - (2)
카테고리: ROCKY
🔔 SFTP 전용 + Chroot
SFTP 전용 + Chroot를 구성으로, 이 설정이 적용된 일부 사용자는 SFTP 및 chroot 디렉토리만 사용하여 액세스할 수 있습니다.
■ 예를 들어 [/home]을 Chroot 디렉터리로 설정
# SFTP 전용 그룹 만들기
$ groupadd sftp_users
$ vi /etc/ssh/sshd_config
# line 138 : 코멘트 아웃 후 라인 추가
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group sftp_users
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /home
ForceCommand internal-sftp
$ systemctl restart sshd
# [test] 사용자를 SFTP 전용 사용자로 설정
$ usermod -aG sftp_users test
■ 사용자 설정 SFTP 전용 설정으로 작업하는지 확인
$ ssh test@node01.test.srv
Enter passphrase for key '/home/rocky/.ssh/id_rsa':
This service allows sftp connections only.
Connection to dlp.srv.world closed. # 정상적으로 거부됨
$ sftp test@node01.test.srv
Enter passphrase for key '/home/test/.ssh/id_rsa':
Connected to node01.test.srv.
sftp>
sftp> ls -l
drwx------ 2 1000 1000 62 Apr 16 07:13 test
sftp> pwd
Remote working directory: /
sftp> quit
🔔 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 키 쌍을 생성하고 공개 키를 서버에 복사
[test@node01 ~]$ 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@node01.test.srv
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]-----+
[root@node01 ~]# ssh-copy-id dlp.test.srv
■ 클라이언트에서 ssh-agent 를 시작하고 ssh-add 명령으로 키를 추가
# SSH-Agent 실행
[test@node01 ~]$ eval $(ssh-agent)
Agent pid 1657
# 비밀번호 추가
[test@node01 ~]$ ssh-add
Enter passphrase for /home/test/.ssh/id_rsa:
Identity added: /home/test/.ssh/id_rsa (test@node01.test.srv)
# 등록된 SSH 키 확인
[test@node01 ~]$ ssh-add -l
3072 SHA256:vxroT8IqL1BnisexijpZmOAJpZsJrLIlVxW9yDB3vHQ test@node01.test.srv (RSA)
# SSH 접속
[test@node01 ~]$ ssh dlp.test.srv hostname
dlp.test.srv
# SSH-Agent 종료
# 종료하지 않으면 로그아웃하여도 SSH-Agent 프로세스가 남아있을 수 있으니 주의
[test@node01 ~]$ eval $(ssh-agent -k)
Agent pid 1657 killed
🔔 SSHPass
SSHPass는 클라이언트에서 서버로 ssh 접속 시 패스워드 요구 없이 할 수 있는 도구
- 클라이언트에서 키 생성(ssh-keygen)하여 서버로 배포(ssh-copy-id)하여, ssh, scp 수행 시 배치모드로 패스워드를 전달하거나 스크립트에 패스워드를 기재하여 접속이 가능하다.
■ SSHPass 설치
$ dnf -y install sshpass
■ SSHPass 사용 방법
# [-p password] :
[root@dlp ~]# sshpass -p 1234 ssh node01.test.srv hostname
node01.test.srv
# [-f file]
[root@dlp ~]# echo '1234' > sshpass.txt
[root@dlp ~]# chmod 600 sshpass.txt
[root@dlp ~]# sshpass -f sshpass.txt ssh node01.test.srv hostname
node01.test.srv
# [-e] : 환경변수로부터
[root@dlp ~]# export SSHPASS=1234
[root@dlp ~]# sshpass -e ssh node01.test.srv hostname
node01.test.srv
🔔 SSH Port Forwarding
SSH Port Forwarding은 SSH 연결을 통해 로컬 머신과 원격 서버 간의 네트워크 연결을 안전하게 전달하는 기술
■ 로컬 포트 포워딩(Local Port Forwarding)
-
로컬 머신에서 원격 서버로 연결을 전달하는 것으로 로컬 머신에서 실행 중인 어플리케이션을 원격 서버에서 실행 중인 어플리케이션과 안전하게 통신하도록 해줍니다.
-
예를 들어, 로컬 머신에서 웹 브라우저를 실행하고, SSH Port Forwarding을 사용하여 로컬 포트를 원격 서버의 웹 서버 포트에 매핑시켜서 웹 서버에 접속하는 경우가 있습니다.
■ 원격 포트 포워딩(Remote Port Forwarding)
-
원격 서버에서 로컬 머신으로 연결을 전달하는 것으로 원격 서버에서 실행 중인 어플리케이션을 로컬 머신에서 실행 중인 어플리케이션과 안전하게 통신하도록 해줍니다.
-
예를 들어, 원격 서버에서 실행 중인 데이터베이스에 로컬 머신에서 접속하기 위해서 SSH Port Forwarding을 사용하여 원격 포트를 로컬 머신의 데이터베이스 포트에 매핑시키는 경우가 있습니다.
■ 예시
- 예를 들어 [dlp.srv.world(192.168.219.101)]의 포트 [8081]에 대한 요청이 [node01.srv.world(192.168.219.102)]의 포트 [80]로 전달되도록 SSH 포트 포워딩을 설정합니다.
# Source 호스트에서 대상 호스트로 SSH 로그인
[root@dlp ~]# ssh -L dlp.test.srv:8081:node01.test.srv:80 root@node01.test.srv
root@node01.test.srv's password:
[root@node01 ~]#
# 확인
[root@node01 ~]# ssh dlp.test.srv "ss -napt | grep 8081"
root@dlp.test.srv's password:
LISTEN 0 128 192.168.219.101:8081 0.0.0.0:* users:(("ssh",pid=43333,fd=4))
■ 확인
댓글 남기기