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

FTP 서버는 파일을 보관하는 네트워크 스토리지 용도로 유용하게 사용할 수 있습니다. 리눅스에는 다양한 FTP 서버가 존재하지만, 그중 별도의 설치 없이 바로 사용할 수 있는 sftp가 있습니다. sftp는 필수 프로그램인 SSH 데몬의 서브 기능으로 제공되기 때문에 추가 설치가 필요 없습니다.

이 글에서는 sftp 전용 계정을 생성하고, 해당 사용자가 접근할 수 있는 디렉터리를 제한하는 방법을 설명합니다. 이를 통해 일반 로그인은 차단하고, 안전한 파일 전송만 허용하는 환경을 구축할 수 있습니다.

 

SFTP의 주요 특징

  • 별도 설치 불필요: SFTP는 SSH 데몬의 부가기능으로 제공되므로, 별도 패키지 설치 없이 바로 사용할 수 있습니다.

  • 보안성: SSH 프로토콜 기반으로 암호화된 전송을 지원하며, 일반 FTP보다 훨씬 안전합니다.


구현 목표

  • SFTP 전용 사용자 생성: 일반 로그인은 불가능하고 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

-s /sbin/nologin 옵션은 사용자 로그인 차단, -d /testuser는 chroot 환경 내 홈 디렉터리 설정입니다. 실제 시스템 상 위치는 /data/testuser가 됩니다.

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

# passwd testuser

 

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

chroot는 사용자의 루트 디렉터리를 특정 경로로 고정시켜 시스템 격리를 구현하는 기능입니다. sftp에서 이를 활용하면 사용자가 지정된 디렉터리 밖으로 나갈 수 없습니다. 이번 예제에서는 /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-server를 비활성화하고 internal-sftp를 사용하며, 특정 사용자에게만 chroot를 적용합니다.

# 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
 Match User 절을 통해 testuser의 접근을 /data 디렉터리로 제한하며, X11 포워딩과 포트 포워딩도 차단합니다.

4. ssh 서비스 재시작

설정 변경 사항을 반영하기 위해 SSH 서비스를 재시작합니다. 이후 SSH 서비스가 정상적으로 동작하는지 상태를 확인합니다.
# systemctl restart sshd
# systemctl is-active sshd
active

sshd 서비스가 active 상태라면 설정이 정상적으로 적용된 것입니다.

 

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

다른 서버에서 sftp 명령어를 사용해 접속을 시도합니다. 성공적으로 접속되면 기본 경로는 /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를 통해 전송해 봅니다. 정상적으로 전송된다면 설정이 올바르게 작동하고 있는 것입니다.

sftp> lls | grep test.sh    # 로컬 파일 확인
test.sh

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

sftp> ls
test.sh

 lls는 클라이언트 로컬에서 파일 목록을 조회하는 명령입니다. 전송된 test.sh 파일이 /testuser 디렉터리에 존재하는지 확인합니다.


다수 사용자 설정을 위한 SFTP 구성 <참고>

여러 사용자가 SFTP를 사용해야 할 경우, 개별 사용자 대신 그룹으로 매칭하는 것이 효율적입니다. 아래는 위 가이드의 5번까지 완료한 후 추가로 설정하는 방법입니다. 이 방식을 사용하면 /data/ 디렉터리 내에 각 사용자 이름의 디렉터리가 생성되며, 이 디렉터리가 각 사용자의 SFTP 루트 디렉터리가 됩니다. 다음은 sftponly라는 전용 그룹을 생성하여 여러 사용자가 동일한 방식으로 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
    
  • 이제 SSH 설정 파일에서 사용자 단위 설정을 그룹 단위로 전환합니다. 이를 통해 sftponly 그룹에 속한 모든 사용자가 동일한 설정으로 SFTP를 사용할 수 있습니다.
    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
    

 

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

각 사용자가 자신의 디렉터리만 접근하도록 설정하려면 디렉터리 권한을 700으로 제한합니다. 이를 통해 사용자 간 파일 접근을 차단할 수 있습니다.

[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/

댓글

이 블로그의 인기 게시물

[Linux] RHEL Local YUM Repository 구성

[Linux Command] sudo command 설명

[Ansible Modules] Fetch module 설명 및 활용