[server] 연결 사용자의 공개 키에 따라 chroot가있는 SFTP

sshfs를 통해 다른 클라이언트에서 백업을받는 서버 (Debian 또는 FreeBSD 실행)를 만들고 싶습니다. 각 클라이언트는 자체 백업 데이터를 읽고 쓸 수 있어야하지만 다른 클라이언트의 데이터는 읽을 수 없습니다.

나는 다음과 같은 아이디어를 가지고 있었다 : 각 클라이언트는 공개 키 인증을 통해 backup@backupserver.local에 연결한다. 사용자 백업 에는 다음과 같은 특별한 certified_keys 파일이 있습니다.

command="internal-sftp" chroot="/backup/client-1/data" ssh-rsa (key1)
command="internal-sftp" chroot="/backup/client-2/data" ssh-rsa (key2)
command="internal-sftp" chroot="/backup/client-3/data" ssh-rsa (key3)
etc...

이것의 장점은 모든 클라이언트에 대해 별도의 사용자를 사용할 필요가 없으며 스크립트를 사용하여 Authorized_keys 파일을 쉽게 자동 생성 할 수 있다는 것입니다.

하나의 문제가 있습니다 : chroot=...작동하지 않습니다. OpenSSH의 authorized_keys 파일은 ChrootDirectory (글로벌 또는 사용자 일치 블록에서 / etc / ssh / sshd_config에서 작동)와 동등한 것으로 보이지 않습니다.

OpenSSH를 사용하여 원하는 것을 달성하기 위해 합리적으로 간단한 방법이 있습니까? 어쩌면 command=...지시를 영리하게 사용합니까? 또는 원하는 것을 수행 할 수있는 다른 SFTP 서버가 있습니까?

편집 : 내가 달성하고자하는 것을보다 명확하게하기 위해 : 여러 클라이언트가 내 서버에 파일을 저장할 수 있기를 원합니다. 각 클라이언트는 다른 클라이언트의 파일을 볼 수 없어야합니다. 그리고 수십 개의 사용자 계정으로 서버를 버리고 싶지 않으므로 클라이언트가 사용자 계정을 공유하고 서로의 파일에 액세스 할 수없는 관리하기 쉬운 솔루션을 원합니다.



답변

또는 원하는 것을 수행 할 수있는 다른 SFTP 서버가 있습니까?

예, 당신은 proftpd를 사용할 수 있습니다

사용자 환경을 준비하십시오. ProFTPD를 사용하면 사용자에게 유효한 쉘을 제공 할 필요가 없습니다.

# useradd -m -d /vhosts/backup/user1/ -s /sbin/nologin user1
# passwd --lock user1
Locking password for user user1.
passwd: Success

# mkdir /vhosts/backup/user1/.sftp/
# touch /vhosts/backup/user1/.sftp/authorized_keys

# chown -R user1:user1 /vhosts/backup/user1/
# chmod -R 700 /vhosts/backup/user1/

SFTPAuthorizedUserKeys에서 OpenSSH 공개 키를 사용하려면이를 RFC4716 형식으로 변환해야합니다. ssh-keygen 도구를 사용하여이 작업을 수행 할 수 있습니다.

# ssh-keygen -e -f user1.public.key > /vhosts/backup/user1/.sftp/authorized_keys

ProFTPD 설정

ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer off

LoadModule mod_tls.c
LoadModule mod_sftp.c
LoadModule mod_rewrite.c

TLSProtocol TLSv1 TLSv1.1 TLSv1.2

# Disable default ftp server
Port 0

UseReverseDNS off
IdentLookups off

# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022

# PersistentPasswd causes problems with NIS/LDAP.
PersistentPasswd off

MaxInstances 30

# Set the user and group under which the server will run.
User nobody
Group nobody

# Normally, we want files to be overwriteable.
AllowOverwrite                  on

TimesGMT off
SetEnv TZ :/etc/localtime

<VirtualHost sftp.example.net>
    ServerName "SFTP: Backup server."
    DefaultRoot ~
    Umask 002
    Port 2121

    RootRevoke on

    SFTPEngine on
    SFTPLog /var/log/proftpd/sftp.log

    SFTPHostKey /etc/ssh/ssh_host_rsa_key
    SFTPHostKey /etc/ssh/ssh_host_dsa_key
    SFTPDHParamFile /etc/pki/proftpd/dhparam_2048.pem
    SFTPAuthorizedUserKeys file:~/.sftp/authorized_keys

    SFTPCompression delayed
    SFTPAuthMethods publickey
</VirtualHost>

<Global>
    RequireValidShell off
    AllowOverwrite yes

    DenyFilter \*.*/

    <Limit SITE_CHMOD>
        DenyAll
    </Limit>
</Global>

LogFormat default "%h %l %u %t \"%r\" %s %b"
LogFormat auth    "%v [%P] %h %t \"%r\" %s"
ExtendedLog /var/log/proftpd/access.log read,write

DH (Diffie-Hellman) 그룹 매개 변수를 작성하십시오.

# openssl dhparam -out /etc/pki/proftpd/dhparam_2048.pem 2048

SFTP 클라이언트를 구성하십시오. FileZilla를 사용했습니다

FileZilla SFTP 서버 설정

디버그 모드에서 ProFPTD를 실행하는 경우

# proftpd -n -d 3

콘솔에서 다음과 같은 것을 볼 수 있습니다

2016-02-21 22:12:48,275 sftp.example.net proftpd[50511]: using PCRE 7.8 2008-09-05
2016-02-21 22:12:48,279 sftp.example.net proftpd[50511]: mod_sftp/0.9.9: using OpenSSL 1.0.1e-fips 11 Feb 2013
2016-02-21 22:12:48,462 sftp.example.net proftpd[50511] sftp.example.net: set core resource limits for daemon
2016-02-21 22:12:48,462 sftp.example.net proftpd[50511] sftp.example.net: ProFTPD 1.3.5a (maint) (built Sun Feb 21 2016 21:22:00 UTC) standalone mode STARTUP
2016-02-21 22:12:59,780 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): mod_cap/1.1: adding CAP_SETUID and CAP_SETGID capabilities
2016-02-21 22:12:59,780 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): SSH2 session opened.
2016-02-21 22:12:59,863 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): Preparing to chroot to directory '/vhosts/backup/user1'
2016-02-21 22:12:59,863 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): Environment successfully chroot()ed
2016-02-21 22:12:59,863 sftp.example.net proftpd[50512] sftp.example.net (192.168.1.2[192.168.1.2]): USER user1: Login successful

/var/log/sftp.log의 다음 줄

2016-02-21 22:12:48,735 mod_sftp/0.9.9[50309]: sending acceptable userauth methods: publickey
2016-02-21 22:12:48,735 mod_sftp/0.9.9[50309]: public key MD5 fingerprint: c2:2f:a3:93:59:5d:e4:38:99:4b:fd:b1:6e:fc:54:6c
2016-02-21 22:12:48,735 mod_sftp/0.9.9[50309]: sending publickey OK
2016-02-21 22:12:59,789 mod_sftp/0.9.9[50309]: public key MD5 fingerprint: c2:2f:a3:93:59:5d:e4:38:99:4b:fd:b1:6e:fc:54:6c
2016-02-21 22:12:59,790 mod_sftp/0.9.9[50309]: sending userauth success
2016-02-21 22:12:59,790 mod_sftp/0.9.9[50309]: user 'user1' authenticated via 'publickey' method

추신

인증 된 키 ( SFTPAuthorizedUserKeys )를 포함하는 파일의 구성된 경로 는 % u 변수를 사용할 수 있으며, 인증되는 사용자 이름과 함께 보간됩니다. 이 기능은 사용자가 자신의 인증 된 키를 관리하도록 요구하지 않고 중앙 위치에있는 인증 된 키의 사용자 별 파일 보유를 지원합니다. 예를 들면 다음과 같습니다.

SFTPAuthorizedUserKeys file:/etc/sftp/authorized_keys/%u

여러 클라이언트가 내 서버에 파일을 저장할 수 있기를 원합니다. 각 클라이언트는 다른 클라이언트의 파일을 볼 수 없어야합니다. 그리고 수십 개의 사용자 계정으로 서버를 버리고 싶지 않기 때문에 클라이언트가 사용자 계정을 공유하고 서로의 파일에 액세스 할 수없는 관리하기 쉬운 솔루션을 원합니다.

ProFTPD로도 가능합니다. 초기 구성을 약간 수정하면됩니다.

<VirtualHost sftp.example.net>
    ...
    SFTPAuthorizedUserKeys file:/etc/proftpd/sftp_authorized_keys
    AuthUserFile /etc/proftpd/sftp_users.passwd

    CreateHome on 0700 dirmode 0700 uid 99 gid 99

    RewriteHome on
    RewriteEngine on
    RewriteLog /var/log/proftpd/rewrite.log
    RewriteCondition %m REWRITE_HOME
    RewriteRule (.*) /vhosts/backup/%u
</VirtualHost>

그리고 하나의 가상 계정을 만듭니다

# ftpasswd --passwd --file /etc/proftpd/sftp_users.passwd --sha512 --gid 99 --uid 99 --shell /sbin/nologin --name user1 --home /vhosts/backup

그게 다야. 모든 추가 계정에 대해 공개 키를 / etc / proftpd / sftp_authorized_keys에 추가하기 만하면됩니다.

참고 : 파일 끝에 새 줄이 있어야합니다! 중요합니다.


답변

chroot=...작동하지 않습니다.

아니요,에 대한 매뉴얼 페이지 sshd에는 authorized_keys파일 형식을 설명하는 내용이 없습니다.

chroot를 넣으면 내부 함수 호출을 대신하기 때문에 command=사용할 수 없습니다 .internal-sftpsshd

분리가 필요한 경우 권장 방법은 더 많은 사용자를 설정하는 것입니다. 다음 internal-sftp과 같이 엄격한 분리가 필요하지 않은 경우 에는 인수를 사용할 수도 있습니다.

command="internal-sftp -d /backup/client-1/data" ssh-rsa (key1)

-P대한 매뉴얼 페이지에서와 같이 옵션을 사용하여 요청 량을 제한 할 수도 있습니다 sftp-server.


답변

한편, 나는 적어도 내 유스 케이스에서 잘 작동하는 또 다른 간단한 솔루션을 생각해 냈습니다.

모든 클라이언트는 동일한 사용자 계정과 같은 키를 사용하여 서버에 연결합니다 (상관하지 않음). OpenSSH chroot는 다음 구조를 가진 디렉토리로 들어갑니다.

d--x--x---   dark-folder
drwxr-x---   |- verylongrandomfoldername1
drwxr-x---   |- verylongrandomfoldername2
drwxr-x---   `- ...

backup 명령과 함께 서버는 클라이언트에게 파일을 넣을 폴더 이름을 알려줍니다. 폴더 이름은 사실상 추측 할 수없는 64 바이트의 임의 문자열이므로 다른 클라이언트가 “어두운 곳”에 있더라도 모든 클라이언트는 자신의 폴더에만 액세스 할 수 있습니다.

다크 폴더의 d–x–x– 모드는 모든 클라이언트가 폴더 (및 아래 폴더)에 들어갈 수 있지만 내용을 나열하거나 새 항목을 만들 수는 없습니다.

하위 폴더는 백업 서버 프로세스에 의해 작성되며 클라이언트와 폴더 사이의 연결은 sqlite db에 저장됩니다.


답변