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