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_config
file konfigurasi. CATATAN: Ini akan membatasi pengguna, backup
hanya 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_config
file. 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_config
file 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 chmod
menulis akses. Banyak solusi yang mungkin ada, seperti meletakkan ~/.ssh/authorized_keys
file 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_keys
file 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_config
untuk detail lengkap tentang sakelar ini.
Membatasi shell pengguna
Untuk kedua solusi di atas, Anda mungkin ingin mengunci backup
pengguna dengan membatasi shell pengguna ini di /etc/passwd
file 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/nologin
juga dapat digunakan jika Anda memilih untuk menggunakan fitur chroot dari sshd_config
sebagaimana diuraikan dalam # 1 di atas. Namun jika Anda memilih untuk menggunakan metode yang diuraikan dalam # 2 , maka Anda kemungkinan harus menggunakan scponly
atau 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_keys
file seperti ini:
command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host
The backup
pengguna 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