มีตัวเลือกสองสามอย่างสำหรับการจัดเก็บรหัสผ่านและความลับอื่น ๆ ที่โปรแกรม Python จำเป็นต้องใช้โดยเฉพาะโปรแกรมที่ต้องทำงานในพื้นหลังซึ่งไม่สามารถขอให้ผู้ใช้พิมพ์รหัสผ่านได้
ปัญหาที่ควรหลีกเลี่ยง:
- การตรวจสอบรหัสผ่านในการควบคุมแหล่งที่มาซึ่งนักพัฒนารายอื่นหรือแม้แต่สาธารณชนสามารถดูได้
- ผู้ใช้รายอื่นบนเซิร์ฟเวอร์เดียวกันอ่านรหัสผ่านจากไฟล์คอนฟิกูเรชันหรือซอร์สโค้ด
- การมีรหัสผ่านในไฟล์ต้นฉบับที่ผู้อื่นสามารถมองเห็นได้บนไหล่ของคุณในขณะที่คุณกำลังแก้ไข
ตัวเลือกที่ 1: SSH
นี่ไม่ใช่ทางเลือกเสมอไป แต่น่าจะดีที่สุด คีย์ส่วนตัวของคุณจะไม่ถูกส่งผ่านเครือข่าย SSH เพียงแค่เรียกใช้การคำนวณทางคณิตศาสตร์เพื่อพิสูจน์ว่าคุณมีคีย์ที่ถูกต้อง
เพื่อให้ใช้งานได้คุณต้องมีสิ่งต่อไปนี้:
- ฐานข้อมูลหรือสิ่งที่คุณกำลังเข้าถึงจำเป็นต้องเข้าถึงได้โดย SSH ลองค้นหา "SSH" บวกกับบริการที่คุณกำลังเข้าถึง ยกตัวอย่างเช่น"SSH PostgreSQL" หากนี่ไม่ใช่คุณสมบัติในฐานข้อมูลของคุณให้ไปยังตัวเลือกถัดไป
- สร้างบัญชีเพื่อเรียกใช้บริการที่จะทำให้การโทรไปยังฐานข้อมูลและสร้างคีย์ SSH
- เพิ่มคีย์สาธารณะลงในบริการที่คุณกำลังจะโทรหรือสร้างบัญชีภายในเครื่องบนเซิร์ฟเวอร์นั้นและติดตั้งคีย์สาธารณะที่นั่น
ตัวเลือกที่ 2: ตัวแปรสภาพแวดล้อม
อันนี้ง่ายที่สุดดังนั้นจึงอาจเป็นจุดเริ่มต้นที่ดี มันอธิบายได้ดีในสิบสองปัจจัย App แนวคิดพื้นฐานคือซอร์สโค้ดของคุณเพียงแค่ดึงรหัสผ่านหรือความลับอื่น ๆ จากตัวแปรสภาพแวดล้อมจากนั้นคุณกำหนดค่าตัวแปรสภาพแวดล้อมเหล่านั้นในแต่ละระบบที่คุณรันโปรแกรม นอกจากนี้ยังอาจเป็นสิ่งที่ดีหากคุณใช้ค่าเริ่มต้นที่จะใช้ได้กับนักพัฒนาส่วนใหญ่ คุณต้องสร้างสมดุลกับการทำให้ซอฟต์แวร์ของคุณ "ปลอดภัยโดยค่าเริ่มต้น"
นี่คือตัวอย่างที่ดึงเซิร์ฟเวอร์ชื่อผู้ใช้และรหัสผ่านจากตัวแปรสภาพแวดล้อม
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)
ค้นหาวิธีตั้งค่าตัวแปรสภาพแวดล้อมในระบบปฏิบัติการของคุณและพิจารณาเรียกใช้บริการภายใต้บัญชีของตนเอง ด้วยวิธีนี้คุณจะไม่มีข้อมูลที่ละเอียดอ่อนในตัวแปรสภาพแวดล้อมเมื่อคุณเรียกใช้โปรแกรมในบัญชีของคุณเอง เมื่อคุณตั้งค่าตัวแปรสภาพแวดล้อมเหล่านั้นโปรดระมัดระวังเป็นพิเศษไม่ให้ผู้ใช้รายอื่นอ่านตัวแปรเหล่านั้น ตรวจสอบสิทธิ์ของไฟล์ตัวอย่างเช่น แน่นอนว่าผู้ใช้ที่ได้รับอนุญาตจากรูทจะสามารถอ่านได้ แต่ก็ไม่สามารถช่วยได้ หากคุณใช้ systemd โปรดดูที่หน่วยบริการและระมัดระวังในการใช้EnvironmentFile
แทนEnvironment
ความลับใด ๆ ค่าสามารถดูได้โดยผู้ใช้ที่มีEnvironment
systemctl show
ตัวเลือกที่ 3: ไฟล์การกำหนดค่า
สิ่งนี้คล้ายกับตัวแปรสภาพแวดล้อมมาก แต่คุณอ่านความลับจากไฟล์ข้อความ ฉันยังพบว่าตัวแปรสภาพแวดล้อมมีความยืดหยุ่นมากกว่าสำหรับสิ่งต่างๆเช่นเครื่องมือการปรับใช้และเซิร์ฟเวอร์การรวมแบบต่อเนื่อง ถ้าคุณตัดสินใจที่จะใช้การตั้งค่าไฟล์, Python สนับสนุนรูปแบบต่าง ๆ ในห้องสมุดมาตรฐานเช่นJSON , INI , NetrcและXML นอกจากนี้คุณยังสามารถหาแพคเกจภายนอกเช่นPyYAMLและTOML โดยส่วนตัวแล้วฉันพบว่า JSON และ YAML ใช้ง่ายที่สุดและ YAML อนุญาตให้แสดงความคิดเห็น
สามสิ่งที่ควรพิจารณากับไฟล์กำหนดค่า:
- ไฟล์อยู่ที่ไหน อาจเป็นตำแหน่งเริ่มต้นเช่น
~/.my_app
และตัวเลือกบรรทัดคำสั่งเพื่อใช้ตำแหน่งอื่น
- ตรวจสอบให้แน่ใจว่าผู้ใช้รายอื่นไม่สามารถอ่านไฟล์ได้
- แน่นอนอย่าผูกมัดไฟล์คอนฟิกูเรชันกับซอร์สโค้ด คุณอาจต้องการกำหนดเทมเพลตที่ผู้ใช้สามารถคัดลอกไปยังโฮมไดเร็กทอรีของตนได้
ตัวเลือกที่ 4: โมดูล Python
บางโครงการก็ใส่ความลับลงในโมดูล Python
db_server = 'dbhost1'
db_user = 'my_app'
db_password = 'correcthorsebatterystaple'
จากนั้นนำเข้าโมดูลนั้นเพื่อรับค่า
from settings import db_server, db_user, db_password
db_connect(db_server, db_user, db_password)
หนึ่งในโครงการที่ใช้เทคนิคนี้Django เห็นได้ชัดว่าคุณไม่ควรผูกมัดsettings.py
กับการควบคุมแหล่งที่มาแม้ว่าคุณอาจต้องการยอมรับไฟล์ที่เรียกsettings_template.py
ว่าผู้ใช้สามารถคัดลอกและแก้ไขได้
ฉันพบปัญหาเล็กน้อยเกี่ยวกับเทคนิคนี้:
- นักพัฒนาอาจส่งไฟล์ไปยังคอนโทรลซอร์สโดยไม่ได้ตั้งใจ การเพิ่มเพื่อ
.gitignore
ลดความเสี่ยงนั้น
- รหัสบางส่วนของคุณไม่อยู่ภายใต้การควบคุมแหล่งที่มา หากคุณมีวินัยและใส่เฉพาะสตริงและตัวเลขที่นี่ก็จะไม่มีปัญหา หากคุณเริ่มเขียนคลาสตัวกรองการบันทึกที่นี่หยุด!
หากโครงการของคุณใช้เทคนิคนี้อยู่แล้วคุณสามารถเปลี่ยนไปใช้ตัวแปรสภาพแวดล้อมได้อย่างง่ายดาย เพียงแค่ย้ายค่าการตั้งค่าทั้งหมดไปยังตัวแปรสภาพแวดล้อมและเปลี่ยนโมดูล Python เพื่ออ่านจากตัวแปรสภาพแวดล้อมเหล่านั้น