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


9

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 서버가 있습니까?

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

답변:


5

또는 원하는 것을 수행 할 수있는 다른 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에 추가하기 만하면됩니다.

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


자세한 답변을 주셔서 감사합니다. 그러나 이것이 서로의 파일을 볼 수 없어야하는 많은 클라이언트에 대해 하나의 사용자 계정 만 사용한다는 주요 목표를 달성하는 데 어떻게 도움이되는지 알지 못합니다. (그리고 스크립트로 쉽게 관리 할 수 ​​있습니다.) 원래의 질문을 다시 읽으면서, 내가 달성하고자하는 것이 완전히 명백하지 않았 음을 인정합니다. 그 죄송합니다.
Xykon42

답변을 업데이트했습니다
ALex_hha

1
좋아, 작은 변화로, 이것은 실제로 잘 작동합니다, 감사합니다! 사용자가 자신의 사용자 이름을 추측하여 (또는 CreateHome 기능을 잘못 사용하여 서버를 넘치게) 다른 사용자의 파일에 액세스 할 수 없도록하려면 authorized_keys 파일이 /foo/authorized_keys.d/%u와 같이 사용자 별이어야합니다.
Xykon42

6

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

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

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

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

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

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


0

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

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.