대상 OS: Ubuntu Server 24.04 LTS
파일을 주고받아야 해서 SSH 계정을 열어줬는데, 어느 순간 그 계정이 ‘쉘까지 가능한 일반 계정’이 되는 경우가 많습니다.
SFTP만 필요했던 사용자가 scp로 이것저것 올리고, ssh로 접속해서 명령을 실행하기 시작하죠.
침해사고 관점에서는 “파일 업로드 가능 + 쉘 실행 가능” 조합이 웹쉘/크론/백도어로 이어지기 쉽습니다.
그래서 운영에서는 “파일 전송만” 되는 계정을 별도로 만들고, 나머지는 원천 차단하는 구성이 자주 쓰입니다.
이 글은 Ubuntu 24.04에서 OpenSSH의 `internal-sftp`와 `Match` 블록을 이용해 SFTP 전용 계정을 격리하고, chroot 권한/디렉터리 구조/검증까지 한 번에 정리합니다.
---
이 구성이 막아주는 것(위협 모델)
1) SFTP 계정으로의 SSH 쉘 로그인 차단
2) 터널링/포트포워딩 악용 차단(원격 프록시로 쓰는 것 방지)
3) 홈 디렉터리 밖으로의 탈출 방지(chroot)
4) 업로드 영역과 읽기 전용 영역 분리로 권한 사고 예방
주의: chroot는 “파일시스템 경계”를 만드는 기능이지, 커널/프로세스 격리까지 제공하는 컨테이너는 아닙니다. 그래도 파일 전송용 계정의 공격면을 크게 줄여줍니다.
---
구성 목표(정책)
1) `sftpusers` 그룹만 SFTP 허용
2) 해당 그룹은 쉘 접근 금지(`ForceCommand internal-sftp`)
3) chroot로 `/srv/sftp/%u` 아래만 보이게
4) 업로드는 `uploads/`에만 가능, 나머지는 읽기 전용(선택)
---
1) OpenSSH 서버 상태 확인(기본 점검)
1) sshd 동작 확인
sudo systemctl status ssh --no-pager
2) 현재 sshd 설정에 Include가 있는지 확인
sudo sshd -T | head -n 20
3) SFTP 서브시스템 설정 확인
sudo sshd -T | grep -i subsystem || true
Ubuntu 24.04는 대개 `/usr/lib/openssh/sftp-server` 또는 `internal-sftp`를 사용할 수 있습니다. 이 글은 `internal-sftp`를 사용합니다(외부 바이너리 경로 의존성이 줄어듭니다).
---
2) 그룹/계정 생성(전용 운영)
1) SFTP 전용 그룹 생성
sudo groupadd --system sftpusers
2) SFTP 전용 사용자 생성(쉘은 막고 홈은 지정)
sudo useradd -m -d /srv/sftp/client1 -s /usr/sbin/nologin -g sftpusers client1
sudo passwd client1
운영에서는 비밀번호 대신 키 인증을 권장하지만, 여기서는 흐름 이해를 위해 비밀번호를 예시로 넣었습니다(아래에서 키 인증으로 전환합니다).
---
3) chroot 디렉터리 구조 만들기(권한이 핵심)
chroot를 쓰려면 “chroot 루트 디렉터리”가 **root 소유**이고 **그룹/기타 쓰기 권한이 없어야** 합니다. 이 조건을 만족하지 못하면 sshd가 보안상 접속을 거부합니다.
1) 기본 디렉터리 생성
sudo install -d -m 0755 /srv/sftp
sudo install -d -m 0755 /srv/sftp/client1
sudo install -d -m 0755 /srv/sftp/client1/uploads
2) 소유권/권한 설정
- chroot 루트(`/srv/sftp/client1`)는 root:root, 0755
- 업로드 디렉터리(`/srv/sftp/client1/uploads`)는 사용자 소유, 0750 또는 0755
sudo chown root:root /srv/sftp/client1
sudo chmod 0755 /srv/sftp/client1
sudo chown client1:sftpusers /srv/sftp/client1/uploads
sudo chmod 0750 /srv/sftp/client1/uploads
3) (선택) 업로드 후 처리용 “수신함”만 쓰게 하고 싶다면
sudo chmod 0730 /srv/sftp/client1/uploads
이 경우 그룹 멤버 외에는 디렉터리 목록도 보기 어려워집니다.
---
4) sshd 설정: Match 블록으로 SFTP 전용 강제
Ubuntu에서는 설정을 `/etc/ssh/sshd_config.d/*.conf`로 분리하는 편이 안전합니다.
1) SFTP 전용 설정 파일 생성
sudo tee /etc/ssh/sshd_config.d/40-sftp-chroot.conf >/dev/null