Ubuntu 16.04에서 셸 액세스 없이 SFTP를 활성화하는 방법
소개
FTP(파일 전송 프로토콜), 최신 FTP 클라이언트에서 널리 지원됩니다.
SFTP는 SSH 액세스가 활성화된 모든 서버에서 추가 구성 없이 기본적으로 사용할 수 있습니다. 안전하고 사용하기 쉽지만 단점이 있습니다. 표준 구성에서 SSH 서버는 시스템에 계정이 있는 모든 사용자에게 파일 전송 액세스 및 터미널 셸 액세스 권한을 부여합니다.
경우에 따라 특정 사용자에게만 파일 전송을 허용하고 SSH 액세스는 허용하지 않을 수 있습니다. 이 자습서에서는 SSH 데몬을 설정하여 사용자별로 SSH 액세스가 허용되지 않는 SFTP 액세스를 하나의 디렉터리로 제한합니다.
전제 조건
이 자습서를 따르려면 다음이 필요합니다.
- 루트가 아닌 sudo 사용자 및 방화벽을 포함하여 이 초기 서버 설정 자습서로 설정된 Ubuntu 16.04 서버 1대
1단계 - 새 사용자 만들기
먼저 서버에 대한 파일 전송 액세스 권한만 부여할 새 사용자를 만듭니다. 여기에서는 사용자 이름 sammyfiles를 사용하고 있지만 원하는 사용자 이름을 사용할 수 있습니다.
- sudo adduser sammyfiles
계정의 비밀번호를 생성하라는 메시지가 표시되고 사용자에 대한 정보가 표시됩니다. 사용자 정보는 선택 사항이므로 ENTER
를 눌러 해당 필드를 비워 둘 수 있습니다.
이제 제한된 디렉터리에 대한 액세스 권한이 부여될 새 사용자를 만들었습니다. 다음 단계에서는 파일 전송을 위한 디렉터리를 생성하고 필요한 권한을 설정합니다.
2단계 - 파일 전송을 위한 디렉토리 생성
SFTP 액세스를 하나의 디렉터리로 제한하려면 먼저 디렉터리가 매우 특정한 SSH 서버의 권한 요구 사항을 준수하는지 확인해야 합니다.
특히 파일 시스템 트리에서 디렉토리 자체와 그 위에 있는 모든 디렉토리는 루트가 소유해야 하며 다른 사람이 쓸 수 없어야 합니다. 결과적으로 홈 디렉토리는 루트가 아닌 사용자가 소유하기 때문에 단순히 사용자의 홈 디렉토리에 대한 제한된 액세스 권한을 부여하는 것은 불가능합니다.
참고: OpenSSH의 일부 버전에는 디렉토리 구조 및 소유권에 대한 엄격한 요구 사항이 없지만 대부분의 최신 Linux 배포판(Ubuntu 16.04 포함)에는 있습니다.
이 소유권 문제를 해결하는 방법에는 여러 가지가 있습니다. 이 자습서에서는 대상 업로드 디렉터리로 /var/sftp/uploads
를 만들고 사용합니다. /var/sftp
는 루트가 소유하며 다른 사용자가 쓸 수 없습니다. 하위 디렉토리 /var/sftp/uploads
는 sammyfiles가 소유하므로 사용자가 여기에 파일을 업로드할 수 있습니다.
먼저 디렉토리를 생성합니다.
- sudo mkdir -p /var/sftp/uploads
/var/sftp
의 소유자를 루트로 설정합니다.
- sudo chown root:root /var/sftp
동일한 디렉토리에 루트 쓰기 권한을 부여하고 다른 사용자에게는 읽기 및 실행 권한만 부여하십시오.
- sudo chmod 755 /var/sftp
uploads
디렉토리의 소유권을 sammyfiles로 변경합니다.
- sudo chown sammyfiles:sammyfiles /var/sftp/uploads
이제 디렉토리 구조가 준비되었으므로 SSH 서버 자체를 구성할 수 있습니다.
3단계 - 하나의 디렉토리에 대한 액세스 제한
이 단계에서는 SSH 서버 구성을 수정하여 sammyfiles에 대한 터미널 액세스는 허용하지 않지만 파일 전송 액세스는 허용합니다.
nano
또는 원하는 텍스트 편집기를 사용하여 SSH 서버 구성 파일을 엽니다.
- sudo nano /etc/ssh/sshd_config
파일 맨 아래로 스크롤하고 다음 구성 스니펫을 추가합니다.
. . .
Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
그런 다음 파일을 저장하고 닫습니다.
각 지시문이 수행하는 작업은 다음과 같습니다.
Match User
는 지정된 사용자에게만 다음 명령을 적용하도록 SSH 서버에 지시합니다. 여기에서 sammyfiles를 지정합니다.ForceCommand internal-sftp
는 SSH 서버가 로그인 시 SFTP 서버를 실행하도록 강제하여 셸 액세스를 허용하지 않습니다.PasswordAuthentication yes
는 이 사용자에 대한 암호 인증을 허용합니다.ChrootDirectory /var/sftp/
는 사용자가/var/sftp
디렉토리 이외의 항목에 액세스할 수 없도록 합니다. 이 chroot 자습서에서 chroot에 대해 자세히 알아볼 수 있습니다.AllowAgentForwarding 아니요
,AllowTcpForwarding 아니요
.X11Forwarding no
는 이 사용자에 대한 포트 전달, 터널링 및 X11 전달을 비활성화합니다.
사용자 일치
로 시작하는 이 명령 세트는 다른 사용자에 대해서도 복사하고 반복할 수 있습니다. 사용자 일치
행에서 사용자 이름을 적절하게 수정해야 합니다.
참고: 보안 강화를 위해 PasswordAuthentication yes
줄을 생략하고 대신 SSH 키 액세스를 설정할 수 있습니다. SSH Essentials: SSH 서버, 클라이언트 및 키 사용 자습서의 공개 SSH 키 복사 섹션을 따르십시오. 사용자의 셸 액세스를 비활성화하기 전에 이 작업을 수행해야 합니다.
다음 단계에서는 암호 액세스를 사용하여 로컬에서 SSH로 구성을 테스트하지만 SSH 키를 설정하는 경우 대신 사용자의 키 쌍을 사용하여 컴퓨터에 액세스해야 합니다.
구성 변경 사항을 적용하려면 서비스를 다시 시작하십시오.
- sudo systemctl restart sshd
이제 sammyfiles에 대해서만 파일 전송에 대한 액세스를 제한하도록 SSH 서버를 구성했습니다. 마지막 단계는 구성을 테스트하여 의도한 대로 작동하는지 확인하는 것입니다.
4단계 - 구성 확인
새 sammyfiles 사용자가 파일만 전송할 수 있도록 합시다.
일반 셸 액세스를 사용하여 sammyfiles로 서버에 로그인하는 것은 더 이상 가능하지 않습니다. 해 보자:
- ssh sammyfiles@localhost
원래 프롬프트로 돌아가기 전에 다음 메시지가 표시됩니다.
Error messageThis service allows sftp connections only.
Connection to localhost closed.
즉, sammyfiles는 더 이상 SSH를 사용하여 서버 셸에 액세스할 수 없습니다.
다음으로 사용자가 파일 전송을 위해 SFTP에 성공적으로 액세스할 수 있는지 확인하겠습니다.
- sftp sammyfiles@localhost
오류 메시지 대신 이 명령은 대화형 프롬프트와 함께 성공적인 로그인 메시지를 표시합니다.
SFTP promptConnected to localhost.
sftp>
프롬프트에서 ls
를 사용하여 디렉토리 내용을 나열할 수 있습니다.
- ls
그러면 이전 단계에서 생성된 uploads
디렉터리가 표시되고 sftp>
프롬프트로 돌아갑니다.
SFTP file list outputuploads
사용자가 실제로 이 디렉터리로 제한되고 그 위의 디렉터리에 액세스할 수 없는지 확인하려면 디렉터리를 그 위의 디렉터리로 변경해 볼 수 있습니다.
- cd ..
이 명령은 오류를 표시하지 않지만 이전과 같이 디렉토리 내용을 나열하면 변경 사항이 표시되지 않아 사용자가 상위 디렉토리로 전환할 수 없음을 증명합니다.
이제 제한된 구성이 의도한 대로 작동하는지 확인했습니다. 새로 생성된 sammyfiles 사용자는 파일 전송을 위해 SFTP 프로토콜만 사용하여 서버에 액세스할 수 있으며 전체 셸에 액세스할 수 없습니다.
결론
전체 셸 액세스 없이 서버의 단일 디렉터리에 대한 SFTP 전용 액세스로 사용자를 제한했습니다. 이 자습서에서는 간결성을 위해 하나의 디렉터리와 하나의 사용자만 사용하지만 이 예제를 여러 사용자와 여러 디렉터리로 확장할 수 있습니다.
SSH 서버는 그룹 또는 여러 사용자에 대한 액세스를 한 번에 제한하거나 특정 IP 주소에 대한 액세스를 제한하는 등 보다 복잡한 구성 체계를 허용합니다. SSH 문제 해결 시리즈에서 추가 구성 옵션의 예와 가능한 지시문에 대한 설명을 찾을 수 있습니다.