Saat Anda ingin memberikan akses administratif ke beberapa pengguna Anda sambil mengontrol dan memeriksa apa yang mereka lakukan di sistem Anda, Anda menggunakan sudo
. Namun, bahkan dengan sudo
, ada beberapa masalah yang tidak terlihat—pikirkan saja untuk memberikan akses shell. sudo
Recent terbaru merilis fitur tambahan yang memungkinkan Anda melihat masalah ini dan bahkan mengontrolnya. Misalnya, Anda dapat mengaktifkan pesan log yang lebih detail dan lebih mudah diproses serta mencatat setiap perintah yang dijalankan dalam sesi shell.
Beberapa fitur ini benar-benar baru. Beberapa dari mereka membangun fitur yang diperkenalkan di versi 1.9.0 atau bahkan lebih awal. Misalnya, sudo
bisa merekam semua yang terjadi di terminal, bahkan di versi 1.8. Namun, sistem menyimpan rekaman ini secara lokal, dan mudah dihapus, terutama rekaman yang paling berguna:sesi Shell. Versi 1.9.0 menambahkan koleksi rekaman sesi pusat, sehingga rekaman tidak dapat dihapus oleh pengguna lokal, dan versi terbaru menambahkan relai, membuat koleksi menjadi lebih kuat.
Jika Anda hanya mengetahui dasar-dasar sudo
atau hanya menggunakan versi 1.8 sebelumnya, saya sarankan membaca artikel saya sebelumnya.
1. Logging berformat JSON
Fitur baru pertama yang ingin saya perkenalkan adalah logging berformat JSON. Saya seorang fanatik logging (saya mulai mengerjakan syslog-ng
proyek dua belas tahun yang lalu), dan fitur ini adalah yang pertama diperkenalkan sejak artikel Opensource.com saya. Saat diaktifkan, sudo
mencatat lebih banyak informasi dan melakukannya dengan cara yang lebih mudah untuk diurai.
syslog
tradisional pesan oleh sudo
pendek dan hanya berisi jumlah minimum informasi yang diperlukan. Ini karena kendala oleh syslog
lama implementasi:Pesan yang berukuran lebih dari 1k dibuang atau dipotong:
Jan 28 13:56:27 localhost.localdomain sudo[10419]: czanik : TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
syslog
yang lebih baru implementasi dapat menangani ukuran pesan yang jauh lebih besar. syslog-ng
menerima pesan log berukuran hingga 64k secara default (tetapi tentu saja, dapat lebih kecil atau lebih besar, tergantung pada konfigurasi sebenarnya).
Acara yang sama berisi lebih banyak informasi jika login dalam format JSON. Lebih banyak tidak berarti lebih sulit untuk ditangani:Pesan berformat JSON lebih mudah diuraikan oleh banyak aplikasi perangkat lunak manajemen log. Ini contohnya:
Jan 28 13:58:20 localhost.localdomain sudo[10518]: @cee:{"sudo":{"accept":{"uuid":"616bc9efcf-b239-469d-60ee-deb5af8ce6","server_time":{"seconds":1643374700,"nanoseconds":222446715,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submit_time":{"seconds":1643374700,"nanoseconds":209935349,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submituser":"czanik","command":"/bin/bash","runuser":"root","runcwd":"/home/czanik","ttyname":"/dev/pts/0","submithost":"localhost.localdomain","submitcwd":"/home/czanik","runuid":0,"columns":118,"lines":60,"runargv":["/bin/bash"],"runenv":["LANG=en_US.UTF-8","HOSTNAME=localhost.localdomain","SHELL=/bin/bash","TERM=xterm-256color","PATH=/home/czanik/.local/bin:/home/czanik/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin","MAIL=/var/mail/root","LOGNAME=root","USER=root","HOME=/root","SUDO_COMMAND=/bin/bash","SUDO_USER=czanik","SUDO_UID=1000","SUDO_GID=1000"]}}}
Anda dapat mengaktifkan pesan log berformat JSON di sudoers
berkas:
Defaults log_format=json
Anda dapat mempelajari lebih lanjut tentang cara bekerja dengan pesan log berformat JSON dari sudo
dari blog syslog-ng saya.
2. Mengumpulkan log secara terpusat menggunakan sudo_logsrvd
Fitur lain yang terkait dengan pencatatan di 1.9.4 adalah mengumpulkan semua sudo
pesan log (termasuk kegagalan) menggunakan sudo_logsrvd
. Sebelumnya, sistem hanya mencatat sesi yang berhasil ketika sudo_logsrvd
benar-benar membuat rekaman. Logging masih dilakukan melalui syslog
secara default pada akhirnya.
Mengapa ini penting? Pertama-tama, Anda dapat mengumpulkan apa pun yang terkait dengan sudo
di satu tempat:Baik rekaman sesi dan semua pesan log yang sesuai. Kedua, itu juga dapat menjamin logging yang tepat dari semua sudo
-acara terkait, sebagai sudo
dapat menolak untuk menjalankan perintah jika sudo_logsrvd
tidak dapat diakses.
Anda dapat mengaktifkan logging ke sudo_logsrvd
dengan pengaturan berikut di sudoers
file (tentu saja, ganti alamat IP):
Defaults log_servers=172.16.167.150
Jika Anda menginginkan pesan log berformat JSON, Anda memerlukan setelan berikut di [eventlog]
bagian sudo_logsrvd
konfigurasi:
log_format = json
Jika tidak, sudo_logsrvd
menggunakan sudo
traditional tradisional format log dengan modifikasi sederhana:Ini juga mencakup informasi tentang host asal log:
Nov 18 12:40:16 centos8splunk.localdomain sudo[21028]: czanik : 3 incorrect password attempts ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Nov 18 12:40:23 centos8splunk.localdomain sudo[21028]: czanik : HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; TSID=00000A ; COMMAND=/bin/bash
Nov 18 12:40:30 centos8splunk.localdomain sudo[21028]: czanik : command rejected by I/O plugin ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Selengkapnya tentang sysadmin
- Aktifkan blog Sysadmin
- Perusahaan Otomatis:panduan untuk mengelola TI dengan otomatisasi
- eBook:Kemungkinan Otomatisasi untuk SysAdmins
- Kisah dari lapangan:Panduan administrator sistem untuk otomatisasi TI
- eBook:Panduan Kubernetes untuk SRE dan sysadmin
- Artikel sysadmin terbaru
3. Relai
Ketika mereka pertama kali memperkenalkan sudo_logsrvd
(versi 1.9.0) untuk pengumpulan rekaman sesi pusat, klien hanya dapat mengirim rekaman secara langsung. Versi 1.9.7 memperkenalkan konsep relai. Dengan relai, alih-alih mengirim rekaman secara langsung, Anda dapat mengirim rekaman ke berbagai tingkat host perantara, yang menyusun jaringan Anda.
Mengapa ini penting? Pertama-tama, relai memungkinkan untuk mengumpulkan rekaman sesi bahkan jika host pusat tidak tersedia karena masalah jaringan atau pemeliharaan. Secara default, sudo
menolak untuk dijalankan ketika tidak dapat mengirim rekaman, jadi relai dapat memastikan bahwa Anda dapat menggunakan sudo
sepanjang waktu.
Kedua, ini juga memungkinkan Anda untuk memiliki kontrol yang lebih ketat di jaringan Anda:Daripada membuka firewall untuk semua host ke sudo_logsrvd
pusat , Anda hanya perlu mengizinkan relai Anda lewat.
Terakhir, ini memungkinkan Anda untuk mengumpulkan rekaman sesi dari jaringan tanpa akses internet langsung, seperti jaringan pribadi AWS, tempat Anda dapat menginstal sudo_logsrvd
dalam mode relai pada host gateway.
Saat Anda menggunakan relai, konfigurasikan sudo
klien dan sudo_logsrvd
pusat tetap sama. Pada host relai, tambahkan baris berikut ke [relay]
bagian sudo_logsrvd.conf
:
relay_host = 172.16.167.161
Jika koneksi jaringan ke server pusat diketahui bermasalah, Anda dapat mengonfigurasi relai untuk menyimpan rekaman sebelum meneruskannya:
store_first = true
4. Mencatat subperintah
Pernahkah Anda ingin tahu apa yang terjadi dalam sesi shell yang dimulai melalui sudo
? Ya, rekaman sesi ada di sana, tetapi menonton rekaman berjam-jam hanya untuk melihat beberapa perintah dieksekusi membosankan dan membuang-buang waktu. Untungnya, versi 1.9.8 memperkenalkan sub-perintah logging. Sekarang cukup memeriksa pesan log Anda secara teratur dan menonton rekaman hanya jika terjadi sesuatu yang mencurigakan.
Anda bahkan tidak memerlukan aturan untuk mengizinkan akses shell untuk memiliki akses shell, cukup akses ke editor. Sebagian besar editor dapat menjalankan perintah eksternal. Editor favorit saya adalah JOE, dan inilah yang dapat Anda lihat ketika saya memulainya melalui sudo
:
Aug 30 13:03:00 czplaptop sudo[10150]: czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe
Tidak ada yang menarik, hanya editor—bahkan jika saya menelurkan shell dan menghapus beberapa file dan partisi dari shell itu. Sekarang mari kita lihat apa yang terjadi ketika Anda mengaktifkan sub-perintah logging:
Aug 30 13:13:14 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/sh -c /bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/readlink /proc/10889/exe
[...]
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/sed -r s@/*:|([^\\]):@\1\n@g;H;x;s@/\n@\n@
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/tty
Aug 30 13:13:42 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/id
Aug 30 13:13:56 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/ls -A -N --color=none -T 0 /usr/share/syslog-ng/include/scl/
Saya menghilangkan lusinan baris untuk menghemat ruang, tetapi Anda masih dapat melihat bahwa saya memulai shell, dan perintah dijalankan oleh bash_profile
juga tersedia di log.
Anda dapat mengaktifkan logging subcommands di sudoers
file menggunakan pengaturan berikut:
Defaults log_subcmds
Dalam sudo
tradisional log, Anda dapat melihat dari sudo
id proses bahwa log ini berasal dari sudo
yang sama sidang. Jika Anda mengaktifkan logging berformat JSON, seperti yang ditunjukkan sebelumnya, sudo
mencatat lebih banyak informasi dalam log, sehingga lebih mudah untuk menganalisisnya.
5. Mencegat sub-perintah
Sub-perintah logging menghapus sebagian besar area masalah yang tersembunyi dari sudo
, tetapi ada situasi ketika Anda tidak ingin hanya menonton apa yang terjadi tetapi juga mengontrol aliran peristiwa. Misalnya, Anda perlu memberikan akses shell ke pengguna tetapi tetap ingin mencegah mereka menjalankan perintah tertentu. Intersepsi sangat ideal dalam kasus seperti itu. Tentu saja ada beberapa batasan, seperti Anda tidak dapat membatasi perintah bawaan shell.
Katakanlah who
perintah itu berbahaya. Anda dapat mengaktifkan intersepsi dalam dua langkah:Yang pertama mengaktifkannya, yang kedua mengonfigurasinya. Dalam hal ini, pengguna saya tidak diizinkan untuk menjalankan who
:
Defaults intercept
czanik ALL = (ALL) ALL, !/usr/bin/who
Inilah yang terjadi ketika saya memulai sesi shell root melalui sudo
dan coba jalankan who
:
$ sudo -s
# who
Sorry, user czanik is not allowed to execute '/usr/bin/who' as root on czplaptop.
bash: /usr/bin/who: Permission denied
Anda dapat dengan mudah menonaktifkan shell yang sedang berjalan sama sekali:
Defaults intercept
Cmnd_Alias SHELLS=/usr/bin/bash, /usr/bin/sh, /usr/bin/csh
czanik ALL = (ALL) ALL, !SHELLS
Namun, itu juga berarti bahwa Anda tidak dapat memulai sesi shell melalui sudo
. Bukan hanya itu, tetapi Anda juga tidak dapat menjalankan perintah eksternal dari editor. Inilah yang terjadi ketika saya mencoba memulai ls
perintah dari dalam vi
:
$ sudo vi /etc/issue
Sorry, user czanik is not allowed to execute '/bin/bash -c /bin/ls' as root on czplaptop.
Cannot execute shell /bin/bash
Press ENTER or type command to continue
Apa selanjutnya?
Saya harap membaca artikel saya membuat Anda ingin mencoba fitur baru ini sendiri. Anda dapat menginstal sudo
terbaru pada banyak distribusi Linux dan varian UNIX dari manajer paket Anda, atau gunakan penginstal biner yang tersedia di situs web Sudo.
Artikel ini hanya memberi Anda gambaran tentang kemungkinan baru. Jika Anda ingin mempelajari lebih lanjut tentang fitur ini, kunjungi situs web, yang menampung halaman manual, dan juga blog Sudo.