Dan ini beberapa bidikan.

PiAlert beraksi

Perangkat dimatikan, tampak depan

Perangkat yang dinonaktifkan, tampilan samping
Saya harus mengatakan bahwa apa yang saya dapatkan, paling banter, dapat disebut perangkat versi alfa. Saya membagikan kode proyek dan model kasus pencetakan 3D di domain publik dengan harapan jika seseorang tertarik dengan proyek saya, mereka akan membantu saya memperbaikinya untuk kebaikan bersama.
Ulasan Proyek
Setelah insiden baru-baru ini dengan salah satu server saya, saya menyadari bahwa saya sangat suka mengobrak-abrik log dan mencari tahu apa yang terjadi. Saya biasanya menggunakan perintah berikut:
tail -n 80 -f /var/log/apache2/error.log
tail -n 80 -f /var/log/apache2/access.log
tail -n 80 -f /var/log/auth.log
Sangat menarik untuk melihat halaman mana yang coba diakses bot entah dari mana, atau akun mana yang mereka coba masuki melalui SSH. Ini juga terlihat seperti film peretas. Lalu saya pikir saya bisa membuat sesuatu yang terlihat jauh lebih menarik daripada jendela terminal. Pada saat ini, proyek yang saya bicarakan di sini lahir.
Hasil pemantauan upaya logon telah berubah baru-baru ini. Ini terjadi setelah saya menerapkan prosedur login yang lebih ketat. Yakni, jumlah upaya untuk masuk ke sistem turun drastis. Ini menjadi jelas setelah sistem pemantauan server yang saya buat berjalan selama 24 jam. Di bawah ini saya akan membicarakan hal ini.
Materi ini dibagi menjadi tiga bagian. Yang pertama tentang perangkat keras, yang kedua tentang pengaturan server, dan yang ketiga tentang program untuk Raspberry Pi.
Perangkat keras
Perangkat saya dirakit dari komponen berikut:
- Raspberry Pi Nol W papan .
- Panel LED Pimoroni Blinkt! ...
- Murah 7 Segmen 4 Digit Tampilan (Putih) dari AliExpress.
Berikut diagram koneksi.

Diagram menghubungkan komponen ke papan
Untuk menghubungkan panel LED Blinkt ke Raspberry Pi! Kabel penghubung DuPont digunakan. Di satu sisi, saya memotongnya dan menyoldernya ke pin yang sesuai dari port GPIO 40-pin panel. Saya tidak dapat menghubungkannya langsung ke papan karena saya masih perlu menghubungkan layar ke sana.
Butuh waktu lama bagi saya untuk membuat panel berfungsi. Pada awalnya, saya pikir instance saya mengalami koneksi yang buruk di konektor. Dan untuk mengetahuinya, saya harus melalui trial and error, menghabiskan lebih banyak waktu daripada yang ingin saya habiskan untuk itu. Setelah saya menghubungi Pimoroni melalui Twitter, ternyata Blinkt! gunakan pin # 2 untuk 5V, bukan pin # 4 seperti yang ditunjukkan pada pinout.xyz . Saya, bagaimanapun, sampai saya mengetahuinya, dengan tergesa-gesa memesan lagi panel LED Blinkt! Seandainya milik saya tidak berfungsi. Dan sekarang, setelah saya berhasil meluncurkan yang pertama, saya perlu memikirkan tentang proyek baru di mana saya dapat menggunakan yang kedua.
Saya menempatkan semua komponen ini dalam wadah yang saya desain di Tinkercad... Badannya dicetak pada printer Ender 3 Pro 3D saya. Saya mendapatkan kasingnya, tetapi saya masih tidak dapat memikirkan bagaimana membuat bagian-bagiannya sehingga mereka akan pas satu sama lain, atau akan diikat satu sama lain dengan kait. Akibatnya, saya membentuk sepasang tiang di salah satu bagian tubuh, dirancang untuk sekrup M5, yang saya gunakan untuk memasang perangkat yang sudah jadi. Posting ini ditempatkan di sepanjang tepi sehingga ada cukup ruang untuk Raspberry Pi.
Untuk mencetak badan, saya menggunakan plastik PLA dari produsen yang tidak diketahui (suhu pencetakan - 217 Β° C, rasio pengisian - 10%). Saya menerapkan pengaturan yang biasa diambil setelah menonton berbagai video di YouTube .

Hasil dari beberapa percobaan untuk mencetak enklosur

Merakit kasing
Saya hanya berhasil membuat panel depan yang tampak bagus pada percobaan kesembilan saya. Setiap saya mencetaknya, ternyata ada sesuatu yang perlu dipindahkan sedikit, atau suatu tempat, walaupun sedikit, ada yang perlu diperbaiki. Saya hanya menggunakan Tinkercad beberapa kali saat mengedit model, dan saya harus mulai mengerjakannya hampir dari awal. Saya ingin memperbaiki bilah LED Blinkt! menggunakan snaps, tetapi setelah beberapa upaya yang gagal menyerah ide ini dan menyelesaikan masalah dengan lem (saya suka benda ini!). Akibatnya, saya memperbaiki tampilan dan papan Raspberry Pi dengannya. Menyelesaikan pekerjaan pada kasus ini, saya sedang menyelesaikan masalah menempatkan papan di dalamnya. Pada awalnya, saya tidak memperbaiki papan dalam kasing dengan cara apa pun, tetapi karena ini, menghubungkan kabel USB ke sana berubah menjadi petualangan nyata.Dalam versi terakhir kasing (jika kita dapat mengatakan bahwa beberapa versinya akan menjadi "final") saya ingin melepaskan sekrup, dari lubang untuk mereka dan dari posting di dalam kasing, dan menemukan cara untuk menghubungkan bagian-bagian kasing, misalnya, dengan menggunakan kait. Jika seseorang ingin mengambil bagian dalam pengerjaan korpus dan mengubah segala sesuatu di dalamnya - Anda dipersilakan! Dan saya juga ingin menutup panel depan casing dengan sesuatu seperti kaca tembus pandang atau sepotong akrilik. Ini akan memberikan tampilan akhir pada perangkat, menyembunyikan terlalu detail "teknis".Jika seseorang ingin mengambil bagian dalam pengerjaan korpus dan mengubah semua isinya - Anda dipersilakan! Dan saya juga ingin menutupi panel depan casing dengan sesuatu seperti kaca tembus pandang atau sepotong akrilik. Ini akan memberikan tampilan akhir pada perangkat, menyembunyikan terlalu detail "teknis".Jika seseorang ingin mengambil bagian dalam pengerjaan korpus dan mengubah semua isinya - Anda dipersilakan! Dan saya juga ingin menutup panel depan casing dengan sesuatu seperti kaca tembus pandang atau sepotong akrilik. Ini akan memberikan tampilan akhir pada perangkat, menyembunyikan terlalu detail "teknis".
Papan Raspberry Pi yang menjadi dasar proyek ini telah digunakan dalam proyek lain yang membutuhkan port GPIO 40-pin untuk dipasang di bagian belakang papan. Ternyata itu menjadi nilai tambah. Papan itu diperbaiki dengan kuat dalam kasing, saya mungkin tidak akan menggunakannya di proyek lain. Oleh karena itu, saya membengkokkan beberapa pin untuk menempatkan semuanya dengan lebih baik di dalam case.

Semuanya pas!
Pada akhirnya, saya punya ide lain, yaitu saya harus melengkapi perangkat dengan setidaknya beberapa tombol. Mungkin bahkan tidak membawanya keluar, tetapi cukup menyembunyikannya di suatu tempat dalam kasing. Satu diperlukan untuk beralih di antara berbagai jenis serangan tetap dan untuk menampilkan nomornya. Dan yang kedua harus, dengan pers singkat, matikan layar, dan dengan tekan lama, matikan Raspberry Pi dengan lembut. Jika perlu, saya selalu dapat terhubung ke perangkat saya melalui SSH, dan jika saya benar-benar membutuhkannya, saya dapat membuat rute URL yang memanggil perintah tersebut
sudo halt.
Konfigurasi server
Ketika, setelah insiden yang disebutkan di atas, saya memperkuat perlindungan server dan menyiapkan pemantauan, saya memeriksa bahwa program fail2ban telah diinstal pada mereka . Ini FOSS yang luar biasa-proyek. Fail2ban memantau log di server dan mencatat informasi tentang sesuatu yang, dalam kondisi normal, tidak boleh terjadi, seperti beberapa upaya login SSH yang gagal. Selanjutnya, program melarang alamat IP asal permintaan yang mencurigakan, melakukan hal ini jika berpotensi menimbulkan masalah serius, atau jika peristiwa tertentu diulangi dalam jangka waktu yang telah ditentukan. Secara default, fail2ban memonitor lalu lintas SSH, tetapi program dapat dikonfigurasi untuk mengawasi hal lain, seperti jumlah kesalahan 404 atau jumlah upaya yang gagal untuk masuk ke panel admin proyek WordPress .
Fail2ban memungkinkan Anda membuat tindakan Anda sendiri yang dipanggil saat berbagai peristiwa terjadi. Ternyata lebih rumit daripada melakukan sesuatu seperti permintaan curl sederhana, jadi saya akhirnya beralih ke GitHub untuk meminta bantuan. Tidak peduli apa yang saya lakukan, saya tidak bisa membuat sistem bekerja sebagaimana mestinya. Untuk memudahkan Anda memecahkan masalah serupa, saya akan memberi tahu Anda tentang bagaimana saya, pada akhirnya, berhasil mengatur semuanya. Yaitu, kita berbicara tentang penggunaan fail2ban pada server berbasis Debian.
Mari buat file
jail.localdan tambahkan yang berikut ini ke dalamnya:
[sshd]
enabled = true
port = ssh
banaction = pinotifyred[myhost="SCRIPTHOSTSERVER"]
Di sini
SCRIPTHOSTSERVERAnda perlu menggantinya dengan URL yang sesuai (misalnya - aktif dev.testing:8080). Perhatikan bahwa tidak ada informasi protokol di awal URL ini, tidak ada jalur di akhir, dan alamat tidak boleh diakhiri dengan garis miring.
Akibatnya, ternyata kami akan mendapatkan tindakan yang biasa terkait dengan SSHD, program akan terus mencekal alamat IP yang mencurigakan, tetapi kami juga akan dapat membuat tindakan tambahan. Sayangnya, Anda tidak bisa begitu saja menjelaskan perintah yang akan dijalankan di sini (ini masalah saya). Sebaliknya, Anda perlu memberi tahu sistem tindakan apa yang harus diambil. Tindakan tersebut dipanggil dari file yang disimpan dalam folder
action.d. Nama file .conf di folder ini sesuai dengan nama tindakan (dalam kasus kami, itu pinotifyred.conf). Seperti inilah tampilan file-file ini:
[Definition]
# get- "http://example.com/red"
actionban = curl --fail "http://<my-host>/red" >> /dev/null
[Init]
# jail- :
my-host = SCRIPTHOSTSERVER
Di sini, sekali lagi, Anda perlu mengubah
SCRIPTHOSTSERVERke URL yang sesuai (semacam dev.testing:8080), dengan mematuhi aturan yang sama yang telah dibahas di atas dalam deskripsi file jail.local.
Kode memanggil tindakan dan mengubah variabel
my-host. Saya tidak bisa mendapatkan semuanya bekerja tanpa variabel seperti itu.
Kode ini menjalankan perintah yang diperlukan. Ini mendeklarasikan beberapa variabel yang diperlukan agar fail2ban berfungsi. Selain itu, cara ini dikonfigurasi berarti bahwa kita memiliki kemampuan untuk mengirim permintaan curl atau wget dengan parameter yang berbeda. Di antara parameter ini, misalnya, mungkin ada informasi tentang IP mana yang dilarang, dan kapan tepatnya itu terjadi. Oleh karena itu, jika Anda ingin menerima informasi yang lebih rinci tentang serangan daripada, seperti dalam kasus saya, hanya data nomornya, Anda dapat menggunakan ini. Yaitu, untuk melakukan ini, Anda dapat menempatkan
action.dfile dengan konten berikut di dalam folder :
[Definition]
# get- "http://example.com/ban.php?jail=sshd&ip=192.0.2.100":
actionban = curl -G --data-urlencode "jail=%(name)s" --data-urlencode "ip=" --fail "http://<my-host>/ban.php"
[Init]
# jail- :
my-host = SCRIPTHOSTSERVER
Saya ingin menunjukkan bahwa mungkin ada bug di sini, karena tindakan tersebut dipanggil dua kali - saat IP diblokir dan saat tidak diblokir. Saya berencana untuk menangani ini nanti, mungkin ini mengarah pada penggandaan jumlah serangan.
Perangkat lunak Raspberry Pi
Sejujurnya, kode saya benar-benar berantakan. Itu ditulis dengan Python 3 oleh seseorang (saya) yang tidak tahu Python, tetapi dapat mencari jawaban atas pertanyaan di Internet. Ini, ditambah dengan pengetahuan pemrograman umum, memungkinkan saya untuk menulis program dengan Python.
Saya tidak akan berbicara di sini tentang menyiapkan Raspberry Pi untuk pekerjaan SSH, karena banyak orang telah membicarakan hal ini . Kode yang dipermasalahkan dihosting di GitHub . Ini diwakili oleh beberapa file. File pertama adalah ini
pialert.py, dimulai saat boot sistem. File kedua, tm1637.pymerupakan library yang saya ambil dari materi ini dari situs RaspberryTips .
Program Python saya bekerja seperti server HTTP (saya tahu ini bukan untuk produksi, tetapi ini masih proyek rumah sederhana) mendengarkan semua permintaan. Ini adalah program utas tunggal, jadi jika ada banyak permintaan, kemungkinan besar akan gagal. Program menunggu URL tiba, dan jika terdaftar dengannya, ia melakukan tindakan. Tindakannya adalah menyalakan LED pada Blinkt !, dengan gaya Larson Scanner , dan meningkatkan penghitung. Pilihan warna LED tergantung pada URL.
Saya menggunakan 4 warna:
- Biru - Menunjukkan serangan telah dilakukan di situs WordPress saya .
- Merah - Serangan SSH di server A.
- Ungu - Serangan SSH di server B.
- Hijau - Serangan URL di server C.
Mungkin, seiring waktu, saya akan memperluas rangkaian serangan yang direkam oleh perangkat. Tetapi bahkan apa yang sekarang memungkinkan Anda untuk tetap mengikuti peristiwa tanpa terhubung ke server.
Dalam kode saya, kesalahan tidak ditangani, dan kemungkinan counter overflow tidak dipantau. Program tersebut, antara lain, menunjukkan kepada saya bahwa bahkan jaringan rumah saya terus-menerus diserang dalam bentuk permintaan untuk URL khusus. Para penyerang mencoba untuk mendapatkan akses ke jaringan melalui kerentanan yang mereka temukan (ini memunculkan pengecualian, tetapi ini tidak menghentikan program).
Salah satu tugas terakhir yang harus saya selesaikan saat mengerjakan proyek adalah menyiapkan Raspberry Pi. Yaitu, saya membutuhkan papan untuk meluncurkan skrip segera setelah memuat, dan kemudian semuanya akan berfungsi. Tugas ini diselesaikan dengan mengedit file
/etc/rc.local. Saya menggunakan editor vi untuk menambahkan perintah ke file yang biasanya digunakan untuk memulai program:
python3 /home/pi/PiAlert/pialert.py &
Setelah itu, saya hanya punya satu tugas tersisa untuk diselesaikan. Itu untuk memberikan akses tanpa gangguan untuk VPS saya ke Raspberry Pi, yang berada di jaringan rumah, di belakang firewall, dan memiliki alamat IP dinamis. Saya dapat menggunakan DNS Dinamis, atau salah satu dari banyak layanan di luar sana. Namun, seseorang dari komunitas Reddit yang dihosting sendiri membuat layanan gratis freemyip.com, yang memecahkan masalah yang perlu saya selesaikan. Dan dia menyelesaikannya dengan baik. Layanan ini belum begitu populer, dan saya yakin, karena biayanya gratis, tidak akan bertahan lama. Tetapi mengingat betapa mudahnya mengerjakannya, saya dengan senang hati akan membayarnya. Saya menemukan layanan menarik lainnya di komunitas yang sama, sliceport.com . Saya akan mencobanya suatu hari nanti juga.
Hasil
The
PiAlert Demonstrasi adalah perangkat yang tidak dapat dibandingkan dengan beberapa hacking hal paling keren dari film. Tujuannya adalah untuk mengingatkan Anda bahwa setiap hari ribuan bot mencoba mengakses sesuatu yang seharusnya tidak dapat mereka akses. Perangkat yang saya buat hanya mentransfer informasi tentang upaya semacam itu ke dunia nyata, mengingatkan kita tentang mereka. Itu juga terlihat sangat lucu.
Hal baik apa lagi yang dapat saya katakan tentang PiAlert? Perangkat terlihat netral dan sangat fleksibel. Jika saya memutuskan bahwa saya tidak lagi membutuhkannya, saya dapat menulis ulang kodenya dan mengubahnya menjadi jam. Atau saya bisa mengubahnya menjadi counter kunjungan ke halaman situs saya. Faktanya - ada banyak pilihan untuk menggunakan LED RGB dan tampilan 4 digit. Selain itu, perangkat tersebut ternyata kompak. Itu berdiri di depan saya di meja saya ketika saya menulis kode dan mengingatkan saya bahwa ada orang di dunia yang melakukan hal-hal buruk. PiAlert membutuhkan daya yang sangat sedikit untuk beroperasi, sehingga dapat berjalan dengan baterai. Itu bisa ditempatkan di mana saja di rumah selama bisa terhubung ke jaringan WiFi. Di sana ia hanya akan melakukan tugasnya.Dan jika saya membutuhkan jaringan lain, itu akan cukup untuk terhubung ke Raspberry Pi melalui SSH atau membuat file baru
wpa_supplicant.confmasuk /boot.
Akibatnya, saya ingin mencatat bahwa kode saya, tentu saja, tidak terlihat sangat bagus. Itu dapat dan harus difaktorisasi kembali. Jika saya pernah belajar Python, saya akan melakukannya di sana. Bodinya juga bisa ditingkatkan dan saya, sekali lagi, jika saya menguasai beberapa program pemodelan 3D, saya akan mengerjakannya. Tetapi, jika Anda tidak memperhitungkan hal ini, saya dapat mengatakan bahwa saya senang dengan apa yang saya lakukan.
Apakah Anda berencana membuat perangkat seperti PiAlert?