[CentOS] 04. SSH 서버 - (2)

Date:     Updated:

카테고리:

태그:


🔔 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 통신 과정

  1. 클라이언트가 서버에 연결 요청을 합니다.

  2. 서버는 클라이언트에게 공개키를 보냅니다.

  3. 클라이언트는 공개키를 사용하여 서버에 대한 암호화된 세션 키를 생성하고, 이를 서버에게 보냅니다.

  4. 서버는 자신의 비밀키를 사용하여 세션 키를 복호화합니다.

  5. 이제 서버와 클라이언트는 세션 키를 사용하여 암호화된 통신을 합니다.

이를 통해 중간에 탈취될 가능성이 있는 패스워드 등의 정보를 안전하게 전송할 수 있습니다.


■ SSH-Agent를 사용했을 때의 통신 과정

  1. 클라이언트가 서버에 연결 요청을 합니다.

  2. 서버는 클라이언트에게 공개키를 보냅니다.

  3. 클라이언트는 SSH-Agent에게 자신의 비밀키를 요청합니다.

  4. SSH-Agent는 요청에 대해 인증된 비밀키를 제공합니다.

  5. 클라이언트는 SSH-Agent로부터 받은 인증된 비밀키를 사용하여 서버에 대한 세션 키를 생성하고, 이를 서버에게 보냅니다.

  6. 서버는 자신의 비밀키를 사용하여 세션 키를 복호화합니다.

  7. 이제 서버와 클라이언트는 세션 키를 사용하여 암호화된 통신을 합니다.

즉, 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)) 


■ 확인

02

CENTOS 카테고리 내 다른 글 보러가기

댓글 남기기