Ada beberapa opsi untuk menyimpan kata sandi dan rahasia lain yang perlu digunakan oleh program Python, terutama program yang perlu dijalankan di latar belakang di mana ia tidak bisa hanya meminta pengguna untuk mengetikkan kata sandi.
Masalah yang harus dihindari:
- Memeriksa sandi untuk mengontrol sumber di mana pengembang lain atau bahkan publik dapat melihatnya.
- Pengguna lain di server yang sama membaca sandi dari file konfigurasi atau kode sumber.
- Memiliki kata sandi dalam file sumber di mana orang lain dapat melihatnya dari balik bahu Anda saat Anda mengeditnya.
Opsi 1: SSH
Ini tidak selalu menjadi pilihan, tapi mungkin yang terbaik. Kunci pribadi Anda tidak pernah dikirim melalui jaringan, SSH hanya menjalankan penghitungan matematis untuk membuktikan bahwa Anda memiliki kunci yang benar.
Untuk membuatnya berfungsi, Anda membutuhkan yang berikut:
- Basis data atau apa pun yang Anda akses harus dapat diakses oleh SSH. Coba telusuri "SSH" plus layanan apa pun yang Anda akses. Misalnya, "ssh postgresql" . Jika ini bukan fitur di database Anda, lanjutkan ke opsi berikutnya.
- Buat akun untuk menjalankan layanan yang akan melakukan panggilan ke database, dan buat kunci SSH .
- Tambahkan kunci publik ke layanan yang akan Anda panggil, atau buat akun lokal di server itu, dan instal kunci publik di sana.
Opsi 2: Variabel Lingkungan
Yang ini adalah yang paling sederhana, jadi ini mungkin tempat yang baik untuk memulai. Ini dijelaskan dengan baik di Aplikasi Dua Belas Faktor . Ide dasarnya adalah bahwa kode sumber Anda hanya menarik kata sandi atau rahasia lain dari variabel lingkungan, dan kemudian Anda mengkonfigurasi variabel lingkungan tersebut di setiap sistem tempat Anda menjalankan program. Mungkin juga sentuhan yang bagus jika Anda menggunakan nilai default yang akan berfungsi untuk sebagian besar pengembang. Anda harus menyeimbangkannya dengan membuat perangkat lunak Anda "aman secara default".
Berikut adalah contoh yang menarik server, nama pengguna, dan kata sandi dari variabel lingkungan.
import os
server = os.getenv('MY_APP_DB_SERVER', 'localhost')
user = os.getenv('MY_APP_DB_USER', 'myapp')
password = os.getenv('MY_APP_DB_PASSWORD', '')
db_connect(server, user, password)
Cari tahu cara menyetel variabel lingkungan di sistem operasi Anda, dan pertimbangkan untuk menjalankan layanan dengan akunnya sendiri. Dengan begitu Anda tidak memiliki data sensitif dalam variabel lingkungan saat Anda menjalankan program di akun Anda sendiri. Saat Anda menyiapkan variabel lingkungan tersebut, berhati-hatilah agar pengguna lain tidak dapat membacanya. Periksa izin file, misalnya. Tentu saja setiap pengguna dengan izin root akan dapat membacanya, tetapi itu tidak dapat membantu. Jika Anda menggunakan systemd, lihat unit layanan , dan berhati-hatilah untuk menggunakan EnvironmentFile
daripada Environment
mencari rahasia. Environment
nilai dapat dilihat oleh setiap pengguna dengan systemctl show
.
Opsi 3: File Konfigurasi
Ini sangat mirip dengan variabel lingkungan, tetapi Anda membaca rahasia dari file teks. Saya masih menemukan variabel lingkungan lebih fleksibel untuk hal-hal seperti alat penerapan dan server integrasi berkelanjutan. Jika Anda memutuskan untuk menggunakan file konfigurasi, Python mendukung beberapa format di pustaka standar, seperti JSON , INI , netrc , dan XML . Anda juga dapat menemukan paket eksternal seperti PyYAML dan TOML . Secara pribadi, saya menemukan JSON dan YAML yang paling sederhana untuk digunakan, dan YAML mengizinkan komentar.
Tiga hal yang perlu dipertimbangkan dengan file konfigurasi:
- Dimana filenya? Mungkin lokasi default seperti
~/.my_app
, dan opsi baris perintah untuk menggunakan lokasi yang berbeda.
- Pastikan pengguna lain tidak dapat membaca file.
- Jelas, jangan memasukkan file konfigurasi ke kode sumber. Anda mungkin ingin memasukkan template yang dapat disalin pengguna ke direktori home mereka.
Opsi 4: Modul Python
Beberapa proyek hanya memasukkan rahasia mereka ke dalam modul Python.
db_server = 'dbhost1'
db_user = 'my_app'
db_password = 'correcthorsebatterystaple'
Kemudian impor modul itu untuk mendapatkan nilainya.
from settings import db_server, db_user, db_password
db_connect(db_server, db_user, db_password)
Satu proyek yang menggunakan teknik ini adalah Django . Jelas, Anda tidak boleh berkomitmen settings.py
pada kontrol sumber, meskipun Anda mungkin ingin memasukkan file bernama settings_template.py
yang dapat disalin dan dimodifikasi pengguna.
Saya melihat beberapa masalah dengan teknik ini:
- Pengembang mungkin tidak sengaja memasukkan file ke kontrol sumber. Menambahkannya untuk
.gitignore
mengurangi risiko itu.
- Beberapa kode Anda tidak di bawah kendali sumber. Jika Anda disiplin dan hanya memasukkan string dan angka di sini, itu tidak akan menjadi masalah. Jika Anda mulai menulis kelas filter logging di sini, berhenti!
Jika proyek Anda sudah menggunakan teknik ini, mudah untuk beralih ke variabel lingkungan. Pindahkan saja semua nilai pengaturan ke variabel lingkungan, dan ubah modul Python untuk membaca dari variabel lingkungan tersebut.