[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
순서
- sftp 전용 사용자 “testuser” 생성
- sftp 사용자가 접속할 data 디렉터리 생성
- 사용자가 /data 디렉터리 외에 접근하지 못하도록 sftp 설정
- ssh 서비스 시작
- 접속 테스트
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 '경로'"라고 기록됩니다.)
- 디렉터리 생성
# mkdir /data
/data 디렉터리를 생성했습니다. chroot로 사용되는 디렉터리이며 sftp에 접속한 사용자는 이 “/data” 디렉터리 밖으로 빠져나가지 못하게 됩니다.
- 사용자 chroot 디렉터리(/data)의 권한은 0755여야 합니다.
# chmod 755 /data ## 확인 # ls -ld /data drwxr-xr-x. 2 root root 6 Jul 4 10:26 /data
- chroot 기본 디렉터리의 소유자는 root여야 하며 다른 소유자일 경우 로그인이 안됩니다.
# chown root:root /data
- 호스트 시스템의 시간대 사용을 위해 파일을 복사합니다.
# mkdir /data/etc; cp /usr/share/zoneinfo/Asia/Seoul /data/etc/localtime
- 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 서비스 재시작
# 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/
댓글
댓글 쓰기