SSH 키, 사용자 분리(sftp 대 SSH), 다양한 포트 및 사용자 디렉터리 제약 조건을 사용하여 Amazon Linux 2에서 SFTP 설정

SSH 키, 사용자 분리(sftp 대 SSH), 다양한 포트 및 사용자 디렉터리 제약 조건을 사용하여 Amazon Linux 2에서 SFTP 설정

TDLR: 사용자 홈 디렉터리에 대한 권한에 따라 SSH 인증 또는 사용자 디렉터리 제약 조건을 얻을 수 있지만 둘 다는 할 수 없는 Catch 22가 있습니다.

그런데, 저는 정말로 제 SFTP 서버를 운영하고 싶습니다. AWS Transfer 서비스나 다른 대안을 사용하는 것을 권장하지 마십시오. 감사해요.

/etc/ssh/sshd_config의 관련 내용(기본값에서 변경됨)은 다음과 같습니다.

Subsystem sftp internal-sftp
Port 22
Port 2299
Match Group sftpusers LocalPort 2299
  ChrootDirectory /sftp-data/%u
  ForceCommand internal-sftp
Match Group sftpusers LocalPort 22
  DenyGroups sftpusers
Match LocalPort 2299  Group *,!sftpusers
  DenyUsers *

나는 ssh가 일반적으로 하는 것처럼 포트 22가 작동하길 원하지만 SFTP가 아닌 사용자에게만 해당됩니다. sftp 사용자의 경우 "sftpusers" 그룹에서 포트 2299가 ssh가 아닌 sftp로만 작동하기를 원합니다. SFTP 사용자가 아닌 경우 포트 2299에 대한 액세스가 거부되기를 원합니다.

좋아, 홈 디렉토리 /sftp-data/user1과 쉘 /sbin/nologin을 사용하여 "user1" 사용자를 만들었습니다. /sftp-data/user1/.ssh/authorized_keys를 생성하고 공개 SSH 키로 채웠습니다. /sftp-data는 700개의 권한을 가진 루트가 소유합니다. /sftp-data/user1/.ssh 이하는 user1이 소유하고 /sftp-data/user1/.ssh/authorized_keys에는 권한 600이 있습니다. /sftp-data/user1의 소유권/권한은 여기서 의문의 여지가 있습니다. 아래에서 더 자세히 알아보세요.

사용자 그룹 sftpusers를 만들고 해당 그룹에 user1을 추가했습니다. 그러나 AWS에 내장된 ec2-user는 해당 그룹의 구성원이 아닙니다. ec2-user를 사용한 테스트는 훌륭하게 작동했습니다. SSH를 통한 액세스, 포트 22는 항상 그렇듯이 작동했지만 포트 2299에는 액세스할 수 없었습니다.

따라서 user1을 사용한 테스트가 흥미로워졌습니다. User1은 포트 22에 액세스할 수 없습니다. 훌륭합니다! user1이 /sftp-data/user1을 소유하면 ssh 공개 키 인증이 포트 2299에서 성공하지만 사용자는 즉시 로그아웃되고 이 메시지는 /var/log/secure에 저장됩니다.

Sep  2 19:21:38 ip-192-168-0-25 sshd[10369]: Accepted publickey for user1 from <ip-address redacted> port 61110 ssh2: ECDSA SHA256:<sha redacted>
Sep  2 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): session opened for user user1 by (uid=0)
Sep  2 19:13:23 ip-192-168-0-25 sshd[9803]: fatal: bad ownership or modes for chroot directory "/sftp-data/user1" [postauth]
Sep  2 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): session closed for user user1

물론이죠. 말이 됩니다. Chroot에서는 /sftp-data/user1이 루트 소유이고 권한 700이 필요합니다. 따라서 그렇게 하면 이제 sftp(ssh 키) 인증이 실패합니다.

Sep  2 19:41:00 ip-192-168-0-25 sshd[11693]: error: AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys user1 SHA256:<sha redacted> failed, status 22

그런데, eic_run_authorized_keys는 AWS가 AWS Instance Connect를 활성화하기 위해 표준 SSH 인증을 제공하는 래퍼입니다.

추가 크레딧을 얻으려면... 위의 문제가 충분히 도전적이지 않다면 모든 프로젝트에 대해 그룹을 만들지 않고 특정 SFTP 사용자에게 특정 프로젝트 디렉토리에 대한 액세스 권한만 부여할 수 있는 체계를 생각해 낼 수 있습니까? 각 사용자의 홈 디렉터리에서 프로젝트 디렉터리로의 링크는 정말 멋질 것입니다.

@anx가 요청한 추가 정보:

# getent passwd user1
user1:x:1001:1001::/sftp-data/user1:/sbin/nologin
# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-data/user1/.ssh/authorized_keys
dr-xr-xr-x root  root      /
drwxr-xr-x root  root      sftp-data
drwx------ root  root      user1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers authorized_keys

SSHD에 대한 DEBUG 로깅을 켰습니다. 루트가 소유한 /sftp-data/user1과 함께 ChrootDirectory 지시문을 사용하고 SSH 인증이 실패하면 /var/log/secure에 다음이 표시됩니다.

debug1: 인증된 키 '/sftp-data/user1/.ssh/authorized_keys'를 열 수 없습니다: 권한이 거부되었습니다.

ps는 루트가 sshd 프로세스를 실행하고 있음을 명확하게 보여줍니다.

답변1

귀하 의 ChrootDirectoryis 는 /sftp-data/user1루트가 소유해야 합니다. 그리고 그건:

# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-data/user1/.ssh/authorized_keys
dr-xr-xr-x root  root      /
drwxr-xr-x root  root      sftp-data
drwx------ root  root      user1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers authorized_keys

그러나 이 시점에서 sshd는 이미 사용자를 user1로 변경하고 권한을 삭제했으므로 user1은 하위 수준 디렉터리로 내려갈 수 없습니다. 그러기 위해서는 디렉토리에 검색 권한( a+x)이 필요합니다.

chmod a+x /sftp-data/user1

이제 user1은 하위 디렉터리로 내려갈 수 있으며 .ssh디렉터리를 읽을 수 있어야 합니다.

답변2

나는 이것이 주로 폴더 권한 문제라고 생각합니다. 제 생각에는 그 디렉토리 /sftp-data/user1/.ssh와 그 아래의 디렉토리가 의 소유임에 틀림없지만 user1, 의 소유인 것처럼 들립니다 root. 다음과 같이 시도해 보세요 root.

공개 키가 /sftp-data/user1/.ssh/authorized_keys정확한지 확인하세요. 그 후에 변경해야 할 권한은 다음과 같습니다.

chmod 700 /sftp-data/user1/.ssh
chmod 600 /sftp-data/user1/.ssh/authorized_keys
chown root:sftpusers /sftp-data
chown -R user1:user1 /sftp-data/user1/.ssh

SSH를 다시 ​​시작하면 좋을 것 같습니다.

관련 정보