[RedHat] SFTP 전용 계정 생성 및 디렉터리 격리 설정 가이드

ftp 서버는 파일을 보관하는 네트워크 스토리지 용도로 유용하게 사용할 수 있습니다. 리눅스에서 제공하는 다양한 ftp서버가 있습니다. 그 중 설치도 필요 없고 바로 사용할 수 있는 ftp 서버인 sftp가 있습니다. sftp 서버의 설치가 필요 없는 이유는 필수 프로그램인 SSH 데몬의 서브 기능으로 제공되기 때문입니다. 이 글에서는 SFTP 전용 계정을 생성하고, 사용자의 접근을 특정 디렉터리로 제한하는 방법을 소개합니다.

 

SFTP의 주요 특징

  1. 별도 설치 불필요: SSH 데몬의 서브 기능으로 제공되어 즉시 사용 가능
  2. 보안성: SSH 프로토콜을 기반으로 하여 암호화된 안전한 파일 전송

 

구현 목표

  • SFTP 전용 사용자 생성 (일반 로그인 불가)
  • 지정된 디렉터리 외 접근 제한

 

환경

Red Hat Enterprise Linux 7

Red Hat Enterprise Linux 8

Red Hat Enterprise Linux 9

 

순서

  1. sftp 전용 사용자 “testuser” 생성
  2. sftp 사용자가 접속할 data 디렉터리 생성
  3. 사용자가 /data 디렉터리 외에 접근하지 못하도록 sftp 설정
  4. ssh 서비스 시작
  5. 접속 테스트

 

1. sftp 전용 사용자 생성

sftp에 사용될 사용자를 생성합니다. 이 사용자는 ssh 로그인이 불가능하며 sftp만 사용할 수 있고, 격리된 chroot 환경의 “/data” 디렉터리에만 접근이 가능합니다.

# useradd -s /sbin/nologin -d /testuser testuser

chroot 환경에서는 지정된 디렉터리가 새로운 루트(/)가 됩니다. 따라서 사용자의 홈 디렉터리를 설정할 때는 chroot 환경 내부의 경로(/testuser)를 사용해야 하며, 실제 시스템의 전체 경로 (/data/testuser)를 사용하면 안 됩니다.

sftp 접속에 사용될 패스워드를 설정합니다.

# passwd testuser

 

2. sftp 사용자가 접속할 디렉터리 생성

chroot는 최상위 디렉터리인 “/” 디렉터리를 변경하여 격리시키는 기능입니다. sftp에서 chroot 기능을 이용하면 사용자가 접속했을 때 chroot로 지정한 디렉터리 밖으로 나가지 못하게 안전한 격리 공간을 생성할 수 있습니다.

여기서는 사용자가 사용할 디렉터리가 “/data”라고 가정하여 설정을 진행합니다. chroot 디렉터리로 사용하는 경우 아래의 조건이 만족 되어야 사용자가 정상적으로 접속이 가능합니다.

chroot 사용 시 디렉터리 소유자와 권한 조건

  • 소유자는 root 여야 한다
  • root 이외의 사용자가 chroot 경로(‘/’)에 쓰기 권한이 있어선 안된다. (root 이외 사용자에게 쓰기 권한이 있는 경우, sftp 접속이 불가능하며, /var/log/secure 로그에 “fatal: bad ownership or modes for chroot directory ‘경로'”라고 기록됩니다.)
  1. 디렉터리 생성
    # mkdir /data
    

    /data 디렉터리를 생성했습니다. chroot로 사용되는 디렉터리이며 sftp에 접속한 사용자는 이 “/data” 디렉터리 밖으로 빠져나가지 못하게 됩니다.

  2. 사용자 chroot 디렉터리(/data)의 권한은 0755여야 합니다.
    # chmod 755 /data
    
    ## 확인
    # ls -ld /data
    drwxr-xr-x. 2 root root 6 Jul  4 10:26 /data
    
  3. chroot 기본 디렉터리의 소유자는 root여야 하며 다른 소유자일 경우 로그인이 안됩니다.
    # chown root:root /data
    
  4. 호스트 시스템의 시간대 사용을 위해 파일을 복사합니다.
    # mkdir /data/etc; cp /usr/share/zoneinfo/Asia/Seoul /data/etc/localtime
    
  5. chroot 디렉터리 아래 사용자의 홈 디렉터리를 생성합니다. 나중에 사용자가 sftp로 접속했을때 사용될 작업 디렉터리가 chroot 내에서는 /testuser 가 되며, 실제로는 /data/testuser 입니다.
    # mkdir /data/testuser
    
    # chown testuser:testuser /data/testuser
    

    sftp 접속 시 위와 같이 홈 디렉터리가 존재하면 “/data/testuser”에서 기본 접속을 시작하고, 존재하지 않을 경우 “/data”에서 기본 접속을 시작합니다. “/data”는 root 소유이기 때문에 디렉터리를 이동해야 하는 번거로움이 발생할 수 있습니다.

 

3. sftp 설정

sftp 설정 sshd_config 파일의 가장 아래 부분에 sftp 설정이 있습니다. 설정 부분을 다음과 같이 변경합니다.

# vi /etc/ssh/sshd_config
...
# override default of no subsystems
#Subsystem      sftp    /usr/libexec/openssh/sftp-server   ## 주석처리
Subsystem       sftp    internal-sftp

# Example of overriding settings on a per-user basis
Match User testuser
        ChrootDirectory /data
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp

 

4. ssh 서비스 재시작

# systemctl restart sshd
# systemctl is-active sshd
active

sshd 서비스가 정상적으로 시작되었습니다.

 

5. 클라이언트 접속 테스트

다른 서버에서 접속을 시도합니다. 접속에 성공하면 현재 위치가 /testuser가 됩니다.

# sftp testuser@192.168.155.88
testuser@192.168.155.88's password:
Connected to 192.168.155.88.
sftp> pwd
Remote working directory: /testuser
sftp>

클라이언트에 있는 임이의 파일을 전송해 보면 정상적으로 전송되는 것을 확인할 수 있습니다.

sftp> lls | grep test.sh   ## 명령어 앞에 l을 붙이면 클라이언트에서 명령을 실행합니다.
test.sh

sftp> put test.sh
Uploading test.sh to /testuser/test.sh
test.sh

sftp> ls
test.sh

 

<참고>다수의 사용자를 위한 SFTP 설정

여러 사용자가 SFTP를 사용해야 할 경우, 개별 사용자 대신 그룹으로 매칭하는 것이 효율적입니다. 아래는 위 가이드의 5번까지 완료한 후 추가로 설정하는 방법입니다. 이 방식을 사용하면 /data/ 디렉터리 내에 각 사용자 이름의 디렉터리가 생성되며, 이 디렉터리가 각 사용자의 SFTP 루트 디렉터리가 됩니다.

  • sftp 전용 그룹 생성
    # groupadd sftponly
    
  • 추가 사용자 생성
    # useradd -s /bin/false -d /testuser2  -g sftponly testuser2
    # useradd -s /bin/false -d /testuser3  -g sftponly testuser3
    
  • 새로 추가된 사용자의 패스워드 설정
    # passwd testuser2
    # passwd testuser3
    
  • 기존 사용자의 기본 그룹 변경
    # usermod -g sftponly testuser
    
  • chroot 내의 사용자 홈 디렉터리 생성 및 권한 설정
    # mkdir /data/testuser
    # mkdir /data/testuser2
    # mkdir /data/testuser3
    
    # chown testuser:sftponly /data/testuser
    # chown testuser2:sftponly /data/testuser2
    # chown testuser3:sftponly /data/testuser3
    
  • sftp 설정 변경 sshd_config 파일에서 기존의 사용자 기반 매칭을 그룹 기반 매칭으로 변경합니다.
    Subsystem       sftp    internal-sftp
    
    # Example of overriding settings on a per-user basis
    Match Group sftponly
            ChrootDirectory /data
            X11Forwarding no
            AllowTcpForwarding no
            ForceCommand internal-sftp
    
    
  • ssh 서비스 재시작
    # systemctl restart sshd
    

 

사용자 간 디렉터리 접근 제한

각 사용자가 자신의 홈 디렉터리만 접근할 수 있도록 하려면 디렉터리 권한을 다음과 같이 변경하면 됩니다.

[root@rhel8 ~]# chmod 700 /data/testuser
[root@rhel8 ~]# chmod 700 /data/testuser2
[root@rhel8 ~]# chmod 700 /data/testuser3

# ls -al /data
total 4
drwxr-xr-x.  6 root      root       67 Jul  8 15:34 .
dr-xr-xr-x. 26 root      root     4096 Jul  8 15:35 ..
drwxr-xr-x.  2 root      root       23 Jul  8 14:33 etc
drwx------.  2 testuser  sftponly   21 Jul  8 15:07 testuser
drwx------.  2 testuser2 sftponly    6 Jul  8 15:34 testuser2
drwx------.  2 testuser3 sftponly   21 Jul  8 15:37 testuser3

이 설정으로 각 사용자는 자신의 디렉터리 내의 파일만 보고 다운로드할 수 있습니다.

 

마치며

이렇게 해서 sftp 전용 계정 생성과 chroot 환경 설정을 통한 접근 제한 방법에 대해 알아보았습니다. 단일 사용자뿐만 아니라 다수의 사용자를 위한 설정 방법도 함께 살펴보았습니다. 이 방법을 사용하면 일반적인 SSH 로그인은 막으면서 SFTP를 통한 파일 전송만 허용할 수 있어, 보안을 강화하면서도 필요한 기능은 유지할 수 있습니다. 특히 chroot를 이용해 사용자를 특정 디렉터리에 격리 시킴으로써, 시스템의 다른 부분에 대한 접근을 효과적으로 차단할 수 있습니다.

더 복잡한 구성이나 디테일한 설정이 필요하면 메일로 문의 주세요.

 

참조

https://www.tecmint.com/restrict-ssh-user-to-directory-using-chrooted-jail/

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top