Apakah mungkin untuk memblokir akses jaringan (keluar) dari satu proses?
linux
networking
process
iptables
Larkee
sumber
sumber
localhost
(ke mesin yang sama) untuk melakukan pekerjaan mereka.Jawaban:
Dengan Linux 2.6.24+ (dianggap eksperimental hingga 2.6.29), Anda dapat menggunakan ruang nama jaringan untuk itu. Anda perlu mengaktifkan 'namespace jaringan' di kernel (
CONFIG_NET_NS=y
) dan util-linux denganunshare
alat ini.Kemudian, memulai proses tanpa akses jaringan sesederhana:
Ini menciptakan ruang nama jaringan kosong untuk proses. Artinya, dijalankan tanpa antarmuka jaringan, termasuk tanpa loopback . Dalam contoh di bawah ini kami menambahkan -r untuk menjalankan program hanya setelah ID pengguna dan grup yang efektif saat ini telah dipetakan ke yang superuser (hindari sudo):
Jika aplikasi Anda membutuhkan antarmuka jaringan, Anda dapat mengatur yang baru:
Perhatikan bahwa ini akan membuat loopback lokal baru . Artinya, proses spawned tidak akan dapat mengakses port terbuka host
127.0.0.1
.Jika Anda perlu mendapatkan akses ke jaringan asli di dalam namespace, Anda dapat menggunakan
nsenter
untuk memasukkan namespace lainnya.Contoh berikut berjalan
ping
dengan namespace jaringan yang digunakan oleh PID 1 (ditentukan melalui-t 1
):sumber
unshare -n
tampaknya membuang "Operasi tidak diizinkan" tanparoot
hak istimewa, apa pun yang saya lewatkan tentang hal itu?sudo unshare -n
mewarisi hak root. Karena saya memerlukan sudo untuk menelepon unshare, saya bertanya-tanya bagaimana saya bisa memastikan bahwa program yang dipanggil tidak memiliki hak root.sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240Linux memiliki fitur yang disebut ruang nama jaringan yang memungkinkan Anda untuk secara esensial memiliki beberapa tumpukan jaringan pada mesin yang sama, dan menetapkan satu untuk suatu program saat menjalankannya. Ini adalah fitur yang biasanya digunakan untuk wadah, tetapi Anda juga dapat menggunakannya untuk mencapai apa yang Anda inginkan.
ip netns
Sub - perintah mengelolanya. Membuat namespace jaringan baru tanpa akses apa pun itu mudah, itu adalah status default namespace baru:Sekarang, jika Anda beralih ke namespace itu, Anda dapat mengonfigurasinya dengan cukup mudah. Anda mungkin ingin memunculkan lo di dalamnya, dan hanya itu:
Sekarang ketika Anda ingin menjalankan perintah Anda tanpa jaringan, Anda jalankan saja di penjara itu:
Jaringan, seperti yang diinginkan, tidak dapat dijangkau. (Anda dapat melakukan semua jenis hal menarik sebagai tumpukan jaringan terpisah termasuk
iptables
aturan, dll.)sumber
sudo ip
mengeksekusi perintah ip, begitu saya menjadi bash, saya hanya mengeksekusisu someuser
untuk mendapatkan shell unprivileged untuk pengguna 'pengguna'.Anda bisa menggunakan iptables dan memindahkan proses itu ke dalam cgroup:
sumber
/sys/fs/cgroup/net_cls/tasks
(tidak ada 'blok' di jalur)Ya, dengan profil apparmor yang disesuaikan, yaitu
Tetapi dengan cara itu, Anda perlu membuat daftar file yang diizinkan untuk diakses juga, seluruh prosedur bisa sedikit rumit. Dan lihat dokumen bantuan di sini
sumber
Anda dapat menggunakan kotak pasir firejail (harus bekerja pada kernel dengan fitur seccomp).
Untuk menggunakannya lakukan saja
--noprofile
menonaktifkan sandbox default--net=none
menonaktifkan jaringanSaya percaya bahwa sebagian besar distro sudah menyediakan paket tetapi bahkan jika mereka tidak firjail sebenarnya tidak memiliki dependensi selain membangun toolchain dan namespace / seccomp enabled kernel.
Ada beberapa fitur bagus lain dari firejail yang dapat ditunjukkan
firejail --help
sehubungan dengan jaringan (seperti hanya menyediakan antarmuka loopback atau memblokir ip / dns dll) tetapi ini harus melakukan pekerjaan. Itu jugadoesn't require root
.sumber
Anda tidak dapat melakukannya dengan iptables saja. Fitur ini secara singkat ada , tetapi tidak dapat dibuat untuk bekerja dengan andal dan ditinggalkan.
Jika Anda dapat menjalankan proses sebagai ID pengguna khusus, iptables dapat melakukannya dengan
owner
modul:Lihat contoh di Iptables: mencocokkan lalu lintas keluar dengan conntrack dan pemilik. Bekerja dengan tetes aneh , aturan iptables / pf hanya mengizinkan aplikasi / pengguna XY?
Jika Anda dapat menjalankan proses dalam wadahnya sendiri, Anda dapat membuat firewall wadah itu secara mandiri (bahkan membuatnya benar-benar terputus dari jaringan).
Modul keamanan dapat memfilter akses proses ke fitur jaringan. Jawaban warl0ck memberi contoh dengan AppArmor.
sumber
Solusi 1: Firewall:
Kita dapat menggunakan firewall seperti Douane atau Opensnitch TAPI aplikasi tersebut tidak 100% efisien atau dalam tahap awal pengembangan (memiliki banyak bug, dll. Hingga 2019)
Solusi 2: Kernel MAC:
Kernel Mac dapat digunakan sebagai firewall yang paling dikenal adalah Tomoyo , SELinux dan AppArmor Solusi ini adalah yang terbaik ketika datang ke stabilitas dan efisiensi (solusi firewall) tetapi sebagian besar waktu pengaturan ini entah bagaimana rumit.
Solusi 3: Firejail:
Firejail dapat digunakan untuk memblokir akses jaringan untuk suatu aplikasi yang tidak memerlukan root apa pun yang bisa diuntungkan oleh pengguna
Solusi 4: Batalkan Berbagi
Unshare dapat memulai aplikasi pada namespace yang berbeda tanpa jaringan tetapi ini membutuhkan solusi root firejail melakukan hal yang persis sama tetapi tidak memerlukan root
Solusi 5: Proksi:
Salah satu solusinya adalah proksi aplikasi ke proxy nol / palsu . Kita bisa menggunakan tsocks atau proxybound . Berikut ini beberapa detail tentang pengaturan
Solusi 6: Iptables:
Solusi mudah lainnya adalah iptables, bisa jadi pengaturan untuk memblokir aplikasi
groupadd no-internet
grep no-internet /etc/group
useradd -g no-internet username
Catatan: Jika Anda memodifikasi pengguna yang sudah ada, Anda harus menjalankan:
usermod -a -G no-internet userName
tanyakan:sudo groups userName
nano /home/username/.local/bin/no-internet
chmod 755 /home/username/.local/bin/no-internet
#!/bin/bash
sg no-internet "$@"
iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
Catatan: Jangan lupa untuk membuat perubahan permanen, jadi itu akan diterapkan secara otomatis setelah reboot . Melakukannya, tergantung pada distribusi Linux Anda.
4. Periksa, misalnya di Firefox dengan menjalankan:
no-internet "firefox"
5. Jika Anda ingin membuat pengecualian dan mengizinkan suatu program untuk mengakses jaringan lokal :
iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP
6. Jadikan permanen
Salah satu cara untuk menerapkan aturan iptables saat boot adalah dengan menambahkan aturan sebagai layanan dengan systemd
sumber
sg no-internet
untuk saat ini.Tergantung pada apa distro yang Anda gunakan, tetapi itu adalah fitur yang biasanya termasuk dalam sistem MAC OS. Seperti yang dinyatakan sebelumnya, Ubuntu atau AppArmor SuSE dapat melakukan ini. Jika Anda menggunakan RHEL, Anda dapat mengonfigurasi SELinux untuk mengizinkan atau menolak akses ke nomor port tertentu berdasarkan label proses eksekusi. Ini semua bisa saya temukan setelah beberapa googling cepat tetapi mungkin ada lebih banyak sumber daya online jika Anda melihat lebih keras dan itu memberi Anda ide umum.
sumber
Anda dapat menggunakan seccomp-bpf untuk memblokir beberapa panggilan sistem. Misalnya mungkin ingin memblokir
socket
panggilan sistem untuk mencegah proses membuat soket FD.Saya menulis contoh persetujuan ini yang mencegah
socket
panggilan sistem untuk bekerja menggunakan libseccomp. Ringkasannya adalah (tanpa memeriksa kesalahan):Ini tidak membutuhkan hak root.
Namun, kotak pasir lengkap jauh lebih kompleks sehingga Anda tidak boleh menggunakan perintah ini untuk memblokir program yang tidak kooperatif / jahat.
sumber
Anda bisa menggunakan program baris perintah yang disebut "proxychains" dan coba salah satu dari kemungkinan berikut:
Setel yang digunakannya ...
Saya belum mengujinya sendiri jadi saya tidak tahu apakah itu berfungsi ...
sumber