Rumah > pembangunan bahagian belakang > Tutorial Python > Menjaga Rahsia Pengujian dengan pytest-mask-secrets

Menjaga Rahsia Pengujian dengan pytest-mask-secrets

WBOY
Lepaskan: 2024-08-12 18:43:59
asal
578 orang telah melayarinya

Securing Testing Secrets with pytest-mask-secrets

Memastikan data sensitif selamat dan peribadi adalah keutamaan utama dalam pembangunan perisian. Log aplikasi, salah satu vektor kebocoran biasa, dijaga dengan teliti untuk mengelakkan kehadiran rahsia. Kebimbangan dan risiko yang sama berlaku juga untuk menguji log, yang boleh mendedahkan kata laluan atau token akses. Alat yang menjalankan aliran kerja CI biasanya menyediakan mekanisme untuk menutup data sensitif dalam log dengan sedikit atau tanpa usaha. Walaupun ini sangat mudah, cekap dan mudah digunakan, dalam situasi tertentu, ini mungkin tidak mencukupi.

Mengapa Penopengan Aliran Kerja CI Sendiri Mungkin Tidak Cukup

Sebagai contoh, Tindakan GitHub melakukan tugas yang baik dalam mengendalikan rahsia. Sebarang rahsia yang ditakrifkan dalam aliran kerja disembunyikan secara automatik daripada output yang ditangkap, yang berfungsi seperti azimat. Walau bagaimanapun, seperti mana-mana sistem CI, ia mempunyai batasannya. Jika laporan output mengambil laluan yang berbeza—seperti disimpan ke fail, junit dijana atau dihantar ke stor log jauh—Tindakan GitHub tidak mempunyai keupayaan untuk memeriksa kandungan dan menutup rahsia.

Selain itu, ujian tidak akan sentiasa berjalan dalam aliran kerja CI, dan walaupun begitu, rahsia mungkin masih perlu disembunyikan. Bayangkan anda menjalankan ujian secara setempat dan berkongsi log untuk membincangkan isu. Tanpa disedari, anda memasukkan URL dengan token akses anda.

Oleh itu, mempunyai mekanisme untuk mengendalikan data sensitif dalam log ujian adalah penting di semua peringkat. Pendekatan terbaik adalah untuk melaksanakan ini secara langsung di peringkat ujian atau dalam rangka kerja ujian itu sendiri. Ini memastikan bahawa rahsia tidak dibocorkan daripada sumber utama, menghalangnya daripada dilepaskan melalui sistem.

Menambah Perlindungan pada Tahap yang Betul

Mengekalkan penyembunyian rahsia secara langsung dalam ujian boleh memakan kos yang agak tinggi dan mudah ralat, dan selalunya terasa seperti kalah. Sebagai contoh, bayangkan anda perlu mereka bentuk URL dengan token sebagai parameter. URL ini mesti dipaparkan secara berbeza untuk digunakan dalam permintaan berbanding dengan kehadirannya dalam log.

Sebaliknya, memintas penjanaan laporan dalam rangka kerja ujian memberikan peluang ideal untuk menyambung ke dalam proses dan mengubah suai rekod untuk menghapuskan data sensitif. Pendekatan ini telus kepada ujian, tidak memerlukan pengubahsuaian pada kod ujian dan berfungsi seperti ciri penyamaran rahsia dalam aliran kerja CI—cukup jalankannya dan lupakan tentang menguruskan rahsia. Ia mengautomasikan proses, memastikan data sensitif dilindungi tanpa menambahkan kerumitan tambahan pada persediaan ujian.

Inilah yang dilakukan oleh pytest-mask-secrets, jelas sekali apabila pytest sedang digunakan untuk pelaksanaan ujian. Di antara banyak cirinya, pytest menawarkan sistem pemalam yang kaya dan fleksibel. Untuk tujuan ini, ia membolehkan anda menyambung ke dalam proses sejurus sebelum sebarang log dijana, pada ketika semua data telah dikumpulkan. Ini memudahkan anda mencari dan mengalih keluar nilai sensitif daripada rekod sebelum ia dikeluarkan.

Mengujinya: Demo Praktikal

Untuk menggambarkan cara ini berfungsi, contoh mudah akan menjadi yang paling berkesan. Di bawah ialah ujian remeh yang mungkin tidak mewakili senario ujian dunia sebenar tetapi berfungsi untuk menunjukkan rahsia-topeng-pytest dengan baik.

import logging
import os


def test_password_length():
    password = os.environ["PASSWORD"]
    logging.info("Tested password: %s", password)
    assert len(password) > 18
Salin selepas log masuk

Dalam contoh ini, terdapat dakwaan yang berpotensi gagal (dan ia akan gagal), bersama-sama dengan mesej log yang mengandungi rahsia. Ya, mungkin kelihatan bodoh untuk memasukkan rahsia dalam log, tetapi pertimbangkan senario di mana anda mempunyai URL dengan token sebagai parameter dan pengelogan nyahpepijat terperinci didayakan. Dalam kes sedemikian, perpustakaan seperti permintaan mungkin secara tidak sengaja merekodkan rahsia dengan cara ini.

Sekarang untuk ujian. Mula-mula, tetapkan rahsia yang diperlukan untuk tujuan ujian:

(venv) $ export PASSWORD="TOP-SECRET"
Salin selepas log masuk

Seterusnya, jalankan ujian:

(venv) $ pytest --log-level=info test.py 
============================= test session starts ==============================
platform linux -- Python 3.12.4, pytest-8.3.2, pluggy-1.5.0
rootdir: /tmp/tmp.AvZtz7nHZS
collected 1 item                                                               

test.py F                                                                [100%]

=================================== FAILURES ===================================
_____________________________ test_password_length _____________________________

    def test_password_length():
        password = os.environ["PASSWORD"]
        logging.info("Tested password: %s", password)
>       assert len(password) > 18
E       AssertionError: assert 10 > 18
E        +  where 10 = len('TOP-SECRET')

test.py:8: AssertionError
------------------------------ Captured log call -------------------------------
INFO     root:test.py:7 Tested password: TOP-SECRET
=========================== short test summary info ============================
FAILED test.py::test_password_length - AssertionError: assert 10 > 18
============================== 1 failed in 0.03s ===============================
Salin selepas log masuk

Secara lalai, nilai rahsia muncul dua kali dalam output: sekali dalam mesej log yang ditangkap dan sekali lagi dalam penegasan yang gagal.

Tetapi bagaimana jika pytest-mask-secrets dipasang?

(venv) $ pip install pytest-mask-secrets
Salin selepas log masuk

Dan dikonfigurasikan dengan sewajarnya. Ia perlu mengetahui senarai pembolehubah persekitaran yang menyimpan rahsia. Ini dilakukan dengan menetapkan pembolehubah MASK_SECRETS:

(venv) $ export MASK_SECRETS=PASSWORD
Salin selepas log masuk

Sekarang, jalankan semula ujian:

(venv) $ pytest --log-level=info test.py 
============================= test session starts ==============================
platform linux -- Python 3.12.4, pytest-8.3.2, pluggy-1.5.0
rootdir: /tmp/tmp.AvZtz7nHZS
plugins: mask-secrets-1.2.0
collected 1 item                                                               

test.py F                                                                [100%]

=================================== FAILURES ===================================
_____________________________ test_password_length _____________________________

    def test_password_length():
        password = os.environ["PASSWORD"]
        logging.info("Tested password: %s", password)
>       assert len(password) > 18
E       AssertionError: assert 10 > 18
E        +  where 10 = len('*****')

test.py:8: AssertionError
------------------------------ Captured log call -------------------------------
INFO     root:test.py:7 Tested password: *****
=========================== short test summary info ============================
FAILED test.py::test_password_length - AssertionError: assert 10 > 18
============================== 1 failed in 0.02s ===============================
Salin selepas log masuk

Kini, bukannya nilai rahsia, asterisk muncul di mana-mana sahaja rahsia itu akan dicetak. Kerja telah selesai dan laporan ujian kini bebas daripada data sensitif.

Menutup pemikiran

Daripada contoh, nampaknya pytest-mask-secrets tidak melakukan lebih daripada apa yang telah dilakukan oleh GitHub Actions secara lalai, menjadikan usaha kelihatan berlebihan. Walau bagaimanapun, seperti yang dinyatakan sebelum ini, alatan pelaksanaan kerja CI hanya menutup rahsia dalam output yang ditangkap, meninggalkan fail JUnit dan laporan lain tidak diubah. Tanpa pytest-mask-secrets, data sensitif masih boleh didedahkan dalam fail ini—ini terpakai kepada mana-mana laporan yang dijana oleh pytest. Sebaliknya, pytest-mask-secrets tidak menutup output langsung apabila pilihan log_cli digunakan, jadi ciri masking aliran kerja CI masih berguna. Selalunya yang terbaik adalah menggunakan kedua-dua alatan bersama-sama untuk memastikan perlindungan data sensitif.

Ini dia. Terima kasih kerana meluangkan masa membaca post ini. Saya harap ia memberikan cerapan berharga untuk menggunakan pytest-mask-secrets untuk meningkatkan keselamatan proses ujian anda.

Selamat Menguji!

Atas ialah kandungan terperinci Menjaga Rahsia Pengujian dengan pytest-mask-secrets. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan