
Menjaga kata sandi selalu menjadi sakit kepala. Dalam versi klasik, Anda memiliki pengguna yang berusaha sangat keras untuk tidak melupakan "qwerty123" yang sangat rahasia dan sistem informasi yang menyimpan hash dari kata sandi ini. Sistem yang baik juga dengan hati-hati menggaruk hash untuk meracuni kehidupan orang jahat yang dapat mencuri database dengan kata sandi hash. Semuanya jelas di sini. Beberapa kata sandi disimpan di kepala, dan beberapa dienkripsi di keepass.
Semuanya berubah ketika kita menghapus dari skema seseorang yang dengan hati-hati memasukkan kunci dari selembar kertas. Dalam interaksi dua sistem informasi, dalam hal apa pun, kata sandi harus disimpan pada sisi klien dalam bentuk terbuka untuk sistem sehingga dapat ditransmisikan dan dibandingkan dengan hash referensi. Dan pada tahap ini, admin biasanya membuka cabang lokal dari pabrik sepeda dan mulai menyembunyikan, mengaburkan, dan mengubur kunci rahasia dalam kode skrip. Banyak dari opsi ini tidak hanya tidak berguna, tetapi juga berbahaya. Saya akan mencoba menawarkan solusi yang nyaman dan aman untuk masalah ini untuk python. Dan sedikit sentuhan pada PowerShell.
Bagaimana tidak
Setiap orang akrab dengan konsep "skrip sementara." Di sini, secara harfiah, hanya data yang dapat dengan cepat diuraikan dari database dan dihapus. Dan kemudian tiba-tiba ternyata skrip telah bermigrasi di suatu tempat dalam produksi dari zona dev. Dan kemudian kejutan yang tidak menyenangkan dari "disposability" awal mulai muncul.
Opsi yang paling umum adalah dalam gaya:
db_login = 'john.doe' password = 'password!'
Masalahnya adalah bahwa di sini kata sandi menyala dengan jelas dan cukup mudah dideteksi di antara setoran skrip lama dengan pencarian otomatis. Versi yang sedikit lebih rumit mengikuti jalur keamanan melalui ketidakjelasan, dengan kata sandi disimpan dalam bentuk terenkripsi langsung dalam kode. Dalam hal ini, dekripsi kembali harus dilakukan segera, jika tidak, klien tidak akan dapat menyajikan kata sandi ini ke sisi server. Metode ini akan menyimpan maksimum dari tampilan biasa, tetapi setiap analisis serius dari kode secara manual akan memungkinkan Anda untuk dengan mudah mengekstrak kunci rahasia. Kode di bawah ini hanya akan menghemat dari "peselancar bahu":
>>> import base64 >>> print base64.b64encode("password") cGFzc3dvcmQ= >>> print base64.b64decode("cGFzc3dvcmQ=") password
Skenario yang paling tidak menyenangkan adalah penggunaan sistem kontrol versi, seperti git, untuk file seperti itu dengan informasi sensitif. Bahkan jika penulis memutuskan untuk menghapus semua kata sandi, mereka akan tetap berada dalam sejarah repositori. Bahkan, jika Anda menjalankan file dengan data rahasia di git, Anda dapat secara otomatis menganggap mereka terganggu dan segera memulai prosedur untuk mengganti semua kredensial yang terpengaruh.
Menggunakan Penyimpanan Sistem
Ada perpustakaan
keyring keren. Prinsip dasar operasi didasarkan pada kenyataan bahwa setiap pengguna OS memiliki penyimpanan terenkripsi sendiri, akses yang hanya mungkin setelah pengguna masuk ke sistem. Ini adalah lintas platform dan akan menggunakan backend untuk menyimpan kata sandi yang disediakan oleh sistem operasi:
- KDE4 & KDE5 KWallet (diperlukan dbus)
- Layanan Rahasia Freedesktop - banyak DE, termasuk GNOME (memerlukan penyimpanan rahasia)
- Loker kredensial Windows
- macOS Keychain
Anda juga dapat menggunakan
backend alternatif atau menulis sendiri, jika benar-benar diperlukan sesuatu yang aneh.
Bandingkan kesulitan serangan
Saat menyimpan kata sandi secara langsung dalam skrip, Anda perlu :
- Mencuri kode itu sendiri (mudah)
- Deobfuscate jika perlu (mudah)
Saat menggunakan keyring lokal, penyerang perlu:- Mencuri kode itu sendiri (mudah)
- Deobfuscate jika perlu (mudah)
- Mengompromikan mesin lokal dengan masuk sebagai pengguna yang diserang (sulit)
Secara teoritis, akses ke penyimpanan lokal dapat diperoleh oleh program lokal apa pun yang berjalan atas nama pengguna saat ini, jika ia mengetahui pengaturan akses untuk kata sandi rahasia. Namun, ini bukan masalah, karena dalam hal akun yang disusupi, penyerang akan dapat mencegat semua data sensitif. Pengguna lain dan perangkat lunak mereka tidak akan memiliki akses ke keystore lokal.
Contoh penggunaan
import argparse import getpass import keyring def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument("-n", "--newpass", required=False, help="Set new password", action="store_true") arguments = parser.parse_args() return arguments def fake_db_connection():
Keamanan Kata Sandi
Kebocoran kata sandi rahasia umum lainnya adalah riwayat baris perintah. Menggunakan input standar tidak diperbolehkan di sini:
age = input("What is your age? ") print "Your age is: ", age type(age) >>output What is your age? 100 Your age is: 100 type 'int'>
Pada contoh di atas, saya telah menyebutkan pustaka
getpass :
Memasukkan data saat menggunakannya mirip dengan pendekatan * nix klasik saat login. Data tidak ditulis atau ditampilkan di layar apa pun di log sistem apa pun.
Sedikit Tentang Powershell
Untuk Powershell, opsi yang tepat adalah menggunakan Locker Kredensial Windows standar.
Ini diimplementasikan oleh modul
CredentialManager .
Contoh penggunaan:
Install-Module CredentialManager -force New-StoredCredential -Target $url -Username $ENV:Username -Pass .... Get-StoredCredential -Target ....