Batasi pencadangan tanpa kata sandi dengan SFTP

11

Saya perlu melakukan backup server ke komputer saya menggunakan Duplicity:

duplicity /etc sftp://[email protected]//home/backup

Sebelum ini dapat dilakukan, saya harus mengizinkan akses tanpa kata sandi dengan melakukan hal berikut:

$ ssh-keygen
$ ssh-copy-id [email protected]
$ ssh [email protected]

Pertanyaan saya adalah, bagaimana cara membatasi perintah hanya untuk transfer SFTP ini di kunci publik yang dihasilkan?

command="restrict to sftp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA…

Dan karena saya menggunakan alamat IP dinamis, bagaimana cara mengatasi masalah "host yang hilang diketahui" setiap kali IP saya berubah?

Pertanyaan Melimpah
sumber
1
"missing host problem diketahui": gunakan StrictHostKeyChecking = tidak ada opsi untuk ssh
Marki
@Marki, terima kasih, pengaturan pada ssh_config berfungsi.
Pertanyaan Overflow

Jawaban:

15

Pertanyaan 1

Pertanyaan saya adalah, bagaimana cara membatasi perintah hanya untuk transfer SFTP ini di kunci publik yang dihasilkan?

Ada 2 metode untuk melakukan ini.

1. - Membatasi sshd

Metode ini melibatkan pengaturan fitur SFTP dalam daemon SSH Anda sshd,. Ini dikendalikan melalui /etc/ssh/sshd_configfile konfigurasi. CATATAN: Ini akan membatasi pengguna, backuphanya diizinkan untuk SFTP ke server.

# /etc/ssh/sshd_config

Subsystem       sftp    internal-sftp

## You want to put only certain users (i.e users who belongs to sftpusers 
## group) in the chroot jail environment. Add the following lines at the end 
## of /etc/ssh/sshd_config

Match User backup
  ForceCommand internal-sftp

2. - Membatasi melalui otor_keys

Metode ini tidak melibatkan perubahan apa pun pada sshd_configfile. Anda dapat membatasi pengguna + kunci SSH untuk satu perintah melalui command=fitur yang telah Anda sebutkan dalam pertanyaan Anda. Caranya ada pada perintah apa yang Anda sertakan. Anda dapat menempatkan server SFTP di command=baris ini , yang memiliki efek yang sama dengan menyiapkan server SFTP di sshd_configfile Anda .

# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host

CATATAN: jika pengguna memiliki akses tulis ~/.ssh/authorized_keys, mereka dapat membaca dan / atau memodifikasinya. Sebagai contoh, mereka dapat mengunduhnya, mengeditnya, dan mengunggahnya kembali dengan menghapusnya commmand=..., memberinya akses perintah yang tidak dibatasi, termasuk shell. Jika pengguna memiliki akses tulis ~/.ssh, mereka juga dapat dengan mudah memutuskan tautan dan membuat ulang file, atau chmodmenulis akses. Banyak solusi yang mungkin ada, seperti meletakkan ~/.ssh/authorized_keysfile di tempat yang tidak dapat ditulis pengguna, seperti dengan:

Match Group sftponly
    AuthorizedKeysFile      /etc/ssh/authorized_keys/%u

Pertanyaan # 2

Dan karena saya menggunakan alamat IP dinamis, bagaimana cara mengatasi masalah "host yang hilang diketahui" setiap kali IP saya berubah?

Ini lebih sulit tetapi bisa dilakukan menggunakan from=fitur di dalam authorized_keysfile juga. Di sini kami membatasi akses hanya dari host somehost.dyndns.org,.

dari = "somehost.dyndns.org", command = "/ usr / libexec / openssh / sftp-server", penerusan no-port, penerusan no-X11, penerusan no-agent, no-pty ssh-dss AAAAC8ghi9ldw == backup @ host

Pengaturan tambahan setelah command=sama pentingnya, karena mereka akan membatasi penggunaan kunci SSH lebih jauh.

gangguan fitur

  • from='hostname1,hostname2,'' - Membatasi akses dari pola IP atau nama host yang ditentukan
  • command='command' - Menjalankan perintah yang ditentukan setelah otentikasi
  • no-pty - Tidak mengalokasikan pty (tidak mengizinkan login interaktif)
  • no-port-forwarding - Tidak memungkinkan penerusan port
  • no-X11-forwarding - pengguna tidak akan dapat menghapus tampilan GUI X11
  • no-agent-forwarding - pengguna tidak akan dapat meneruskan melalui host ini ke host internal lainnya

Untuk menghilangkan pesan tentang "host yang hilang yang diketahui", Anda dapat menambahkan opsi SSH ini ke klien ketika terhubung seperti:

$ ssh -o StrictHostKeyChecking=no ....

Lihat halaman manual, ssh_configuntuk detail lengkap tentang sakelar ini.

Membatasi shell pengguna

Untuk kedua solusi di atas, Anda mungkin ingin mengunci backuppengguna dengan membatasi shell pengguna ini di /etc/passwdfile juga. Biasanya Anda ingin mengaturnya scponly, tetapi ada pilihan lain untuk ini. Lihat U&L Q&A ini berjudul: " Apakah Anda memerlukan shell untuk SCP? " Untuk cara melakukan ini.

Penggunaan /sbin/nologinjuga dapat digunakan jika Anda memilih untuk menggunakan fitur chroot dari sshd_configsebagaimana diuraikan dalam # 1 di atas. Namun jika Anda memilih untuk menggunakan metode yang diuraikan dalam # 2 , maka Anda kemungkinan harus menggunakan scponlyatau sesuatu yang lain untuk shell pengguna /etc/passwd.


BONUS - Memperluas # 2 di atas

Jika Anda perlu mengekspos serangkaian perintah untuk pengguna ini, Anda juga dapat melakukan ini. Membuat script seperti begitu, /home/backup/commands.sh:

#!/bin/sh

case $SSH_ORIGINAL_COMMAND in
  "diskspace")
    df -h
    ;;
  "dirlist")
    ls -1
    ;;
  "apache_restart")
    /etc/init.d/apache restart
    ;;
  *)
    echo "Unknown command"
esac

Anda kemudian mengatur authorized_keysfile seperti ini:

command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host

The backuppengguna kemudian dapat menjalankan perintah ini seperti:

# diskspace
$ ssh -q user@remote_host diskspace
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/dev-root   39G  2.2G   35G   6% /

# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql

Referensi

slm
sumber
Hati-hati dengan perintah apa yang Anda izinkan pengguna akses atau pengguna mungkin memiliki kemampuan untuk mendapatkan shell penuh. Sebagai contoh, jika Anda memberi seseorang akses ke vim, mereka dapat dengan mudah:! / Bin / bash atau:! / Bin / someotherprogram.
rking
@rking - ya itu tidak usah dikatakan ...
slm
Terima kasih telah memberikan saya jawaban terperinci. Pembatasan perintah berfungsi dengan sempurna. Namun ada dua masalah. 1) IP dinamis mengacu pada komputer saya, bukan server. Nama host di bidang "dari" file otor_keys hanya membatasi alamat dari mana server dapat mengakses komputer saya dan tidak melakukan apa pun untuk menyelesaikan masalah "host yang dikenal hilang" di komputer saya. 2) Menonaktifkan login shell untuk pengguna cadangan di komputer saya dengan /sbin/nologinakan mencegah server mengakses komputer saya dengan SFTP. Saya mencoba ini.
Pertanyaan Overflow
1
Maaf bila membingungkan. Server S menjadi klien ketika melakukan koneksi SFTP backend ke komputer saya C. Masalah "host yang hilang diketahui" terjadi setiap kali server S yang melakukan pencadangan menghubungkan ke lokasi yang tidak tercantum pada known_hostsfile ssh-nya . Marki memberikan solusi yang benar dalam komentarnya. The fromparameter dalam authorized_keysfile di komputer saya C hanya membatasi lokasi dari mana S dapat terhubung ke C.
Pertanyaan Overflow
Ya, silakan lanjutkan untuk mengedit. Ngomong-ngomong aku sadar itu /sbin/nologinberfungsi jika aku menggunakan perintah force internal-sftpalih-alih /usr/libexec/openssh/sftp-serveryang telah kamu tentukan pada sertifikat. Saya kira ini adalah dua subsistem yang berbeda. Dan membuat direktori chroot untuk yang pertama jauh lebih mudah.
Pertanyaan Overflow
0

Shell yang Dibatasi

Anda perlu menetapkan shell terbatas seperti scponly atau rssh.

Ketika Anda menggunakan scp atau sftp Anda terhubung ke situs jarak jauh melalui ssh dan kemudian shell jauh mengeksekusi proses scp atau proses sftp. Yang Anda butuhkan adalah shell terbatas yang hanya memungkinkan scp atau sftp untuk mengunci login.

rking
sumber