Kurulum
Python 3.12 ya da üstü gerekir. Windows, macOS ve Linux'ta çalışır.
$ pip install sealbox # ya da $ pipx install sealbox # ayrı bir ortamda, her yerden erişilebilir $ pip install -e . # kaynak koddan (repo kökünde)
Bağımlılıklar: cryptography, pydantic, shamir-mnemonic, keyring, bcrypt.
Genel kullanım
- -h, --help
- Yardımı göster. Komutsuz
sealboxgruplu listeyi gösterir. - -V, --version
- Sürümü göster.
- --lang {tr,en}
- Mesaj dili.
SEALBOX_LANGortam değişkeniyle de verilir. Varsayılan: bilgisayarın dili. - help <komut>
- Bir komutun ayrıntısı ve örnekleri (
sealbox <komut> --helpile aynı).
Komutlar beş grupta toplanır:
| Grup | Komutlar |
|---|---|
| Başlarken | init, status |
| Günlük kullanım | seal, exec, vault |
| Ekip | team |
| Kurtarma | recovery |
| Git | history, hook |
Yanlış yazılan komutta öneri gelir: sealbox sael → "Bunu mu demek istediniz: seal?". Komutlar her IDE'nin terminalinde (VS Code, PyCharm, Eclipse…) aynıdır.
sealbox init
dosya değiştirmezProjeyi kontrol eder ve sıradaki adımları sırayla söyler. Yeni bir projede ilk çalıştırılacak komuttur.
- -w, --workspace KLASÖR
- Proje kökü (varsayılan: bulunduğun klasör).
- -c, --config DOSYA
sealbox.tomlyolu.
$ sealbox init # bulunduğun klasördeki projeyi kontrol et $ sealbox init -w C:\projem # başka bir klasör
sealbox status
dosya değiştirmezKasanın, anahtarın, kurtarma kodunun ve ekibin durumunu gösterir. Sorunlu her satırın yanında yapman gerekeni yazar. Bir şey açılamıyorsa çıkış kodu 1 döner.
- --json
- Betikler ve CI için makinenin okuyabileceği rapor.
$ sealbox status ✓ Kasa: 4 değişken, 2 karalanmış veri ✗ Kasa anahtarı bu bilgisayarda yok → sealbox recovery restore · Ekip kurulmamış (tek kişi) → sealbox team init --github <ad> ⚠ 2 dosyada açık sır var → sealbox seal
sealbox seal
dosyaları yeniden yazarDosyalardaki parola, token, API anahtarı ve kişisel verileri bulur:
- Koddaki sırları kasaya taşır, yerine ortam değişkeni okuması yazar (Python
os.environ, JS/TSprocess.env, JavaSystem.getenv). - E-posta ve TCKN gibi verileri
__SECURE_..__etiketiyle karalar. .envdosyasını kasaya alır, yerine.env.sealedbırakır.
- yollar
- Dosya ya da klasörler (varsayılan: tüm proje).
- --check
- Yazma, yalnızca bak. Açık sır varsa çıkış kodu 1.
- --json
- Raporu JSON olarak bas: satır, sütun ve kategori içerir, değer içermez. Editör eklentisi bunu kullanır.
- -w, --workspace
- Proje kökü.
- -c, --config
sealbox.tomlyolu.
$ sealbox seal --check # yalnızca bak: diskte açık sır var mı? $ sealbox seal # tüm projedeki sırları kasaya taşı $ sealbox seal src/config.py # yalnızca bir dosya
Proje kökünden çalıştırın. Alt klasörden çalıştırıldığında üstte .env, .git ya da kasa varsa durur, çünkü üstteki .env açıkta kalırdı. O klasörü bilerek seçiyorsanız -w . verin.
Karalaması doğrulanamayan bir dosyaya dokunulmaz, [!] uyarısı verilir ve taramanın geri kalanı devam eder. Karalama yedekleri de kasa anahtarıyla şifrelenir.
sealbox exec
onay isterProgramını kasadaki sırlarla çalıştırır. Önce hangi değerlerin verileceğini gösteren bir onay penceresi açılır. Sırlar yalnızca bu çalıştırmaya ortam değişkeni olarak verilir. Programın çıktısındaki sırlar [GİZLİ:..] olarak basılır.
- -- komut
--işaretinden sonra çalıştırılacak komut.- -w, --workspace
- Proje kökü (varsayılan: kasası olan üst klasör).
$ sealbox exec -- python app.py # Python $ sealbox exec -- npm start # Node.js $ sealbox exec -- java Main.java # Java $ sealbox exec -- mvn spring-boot:run # Maven / Gradle
Tasarım gereği: Onayı atlatan bir bayrak ya da ortam değişkeni bilerek yok. Çocuk sürecin çıktısı bir borudan geçtiği için etkileşimli ya da renkli terminal programları farklı davranabilir.
sealbox vault
Kasadaki kayıtları yönetir. Değerler hiçbir zaman terminale kendiliğinden yazılmaz. Göstermek ve değiştirmek onay ister. Tüm alt komutlar -w, --workspace alır.
| Alt komut | Kullanım | Ne yapar |
|---|---|---|
list | vault list | Değişken adları ve karalanmış etiketler. Değer göstermez. |
reveal | vault reveal AD | Değeri onay penceresinde gösterir. AD bir değişken ya da __SECURE_..__ etiketi olabilir. |
set | vault set AD | Değeri değiştirir ya da ekler (değer pencereden sorulur). |
expose | vault expose ETİKET [--as AD] | Karalanmış veriyi programa çalışırken verir. Etiket, kodda os.environ[...] olur. --as ortam değişkeninin adını belirler (varsayılan: atamadan çıkarılır). |
remove | vault remove [AD...] [--unused] [--force] | Kayıt siler (onay ister). --unused: hiçbir dosyanın kullanmadığı kayıtlar. --force: dosyada kullanılıyor olsa da sil. |
reset | vault reset | Anahtar kayıpsa ve kurtarma yoksa yeni boş kasa açar. Eskisi kenara kaldırılır. |
$ sealbox vault list $ sealbox vault reveal DB_PASSWORD $ sealbox vault reveal __SECURE_TCKN_103d…__ $ sealbox vault set DB_PASSWORD $ sealbox vault expose __SECURE_EMAIL_8f2c…__ --as ADMIN_EMAIL $ sealbox vault remove --unused
Aynı değer her zaman aynı kayda bağlanır, bu yüzden tekrar mühürlemek kopya oluşturmaz. Bir dosya kaydın etiketini ya da değişken adını hâlâ içeriyorsa kayıt --force olmadan silinmez.
sealbox team
Kasayı arkadaşlarınla paylaşır. Kasa repoya girer. Değerleri yalnızca ekipteki GitHub hesaplarının SSH anahtarları açabilir. Her değişiklikten sonra commit + push et.
| Alt komut | Kullanım | Ne yapar |
|---|---|---|
init | team init --github AD | Ekibi kurar, sen sahip olursun. Bu bilgisayarın SSH anahtarı o GitHub hesabında olmalı. |
add | team add KULLANICI [--owner] | github.com/KULLANICI.keys adresinden açık anahtarları alır ve erişim verir. --owner: sahip olarak ekle. |
remove | team remove KULLANICI | Ekipten çıkarır. Kasa anahtarı (DEK) yenilenir, görmüş olabileceği değerler listelenir. |
promote | team promote KULLANICI | Üyeyi sahip yapar. |
list | team list | Üyeler, rolleri ve SSH parmak izleri. |
$ sealbox team init --github benim-adim $ sealbox team add arkadasim $ sealbox team add arkadasim --owner $ sealbox team remove arkadasim $ sealbox team list
- Sahip / üye: Sahipler kişi ekleyip çıkarabilir. Kural yazılım düzeyindedir. Kasayı açabilen bir üye teknik olarak başkasına kopya verebilir.
- Desteklenen anahtarlar: ed25519 (X25519'a çevrilir) ve RSA (OAEP).
- Şifresiz SSH anahtarı reddedilir. Şifre eklemek için:
ssh-keygen -p -f ~/.ssh/id_ed25519. Şifre terminalden değil pencereden sorulur. - Bütünlük:
team.json'daki her kayıt DEK'ten türetilen anahtarla MAC'lidir. Repoya yazabilen ama DEK'i bilmeyen biri sahte üye ya da rol ekleyemez.
sealbox recovery
Kasa anahtarı kaybolursa (Windows sıfırlama, yeni bilgisayar) kasayı geri açan kurtarma kodu. Kod ve parçalar yalnızca pencerede gösterilir, terminale yazılmaz.
| Alt komut | Kullanım | Ne yapar |
|---|---|---|
setup | recovery setup [--new] | Kurtarma kodu üretir (kullanıcı başına bir kod). --new: var olan kodu yenisiyle değiştir. |
shares | recovery shares | Kodu 2-of-3 Shamir parçasına böler (SLIP-39). Herhangi 2'si yeter. |
restore | recovery restore [--kit DOSYA] | Kod ya da 2 parçayla anahtarı geri getirir. --kit: kasa klasörü de gittiyse kitten. |
export | recovery export DOSYA | Kurtarma kiti yazar (kilitli DEK + şifreli kasa). Kod olmadan açılmaz. |
status | recovery status [--json] | Kurtarma kurulu mu? |
$ sealbox recovery setup $ sealbox recovery shares $ sealbox recovery export D:\proje.sapkit $ sealbox recovery restore $ sealbox recovery restore --kit D:\proje.sapkit
Kurtarma kopyaları ~/.sealbox/recovery/ altındadır, proje klasöründe değil, repoya girmez. Açık yarı saklandığı için yeni projeler kod sorulmadan kurtarmaya kilitlenir.
sealbox history
dosya değiştirmezKasadaki değerleri git geçmişinin tamamında arar. Kasaya taşınmadan önce commit edilmiş bir sır eski commit'lerde okunabilir. Değerler ekrana yazılmaz; yalnızca ad, commit ve dosya. Bir şey bulursa çıkış kodu 1.
- -w, --workspace
- Proje kökü.
- --json
- Raporu JSON bas (editör eklentisi kullanır). Değer içermez.
$ sealbox history Git geçmişi: ⚠ DB_PASSWORD: 2 commit'te açık — uzak sunucuya gönderilmiş ilk: 3f9c2e1 2026-10-02, src/config.py → servisinden yenile, sonra: sealbox vault set DB_PASSWORD
Push'landıysa paylaşılmıştır: commit uzak bir dalda varsa değer başkasının elinde olabilir. Değeri servisinden yenile; geçmişi yeniden yazmak tek başına yetmez.
sealbox hook
Git'e bir pre-commit kancası kurar: kasadaki bir değer commit'e girmeye çalışırsa commit dosya:satır ile durdurulur. Kazaya karşı emniyet kemeridir; git commit --no-verify onu atlar. Kanca repoya girmez, ekipteki herkes kendi bilgisayarına kurar.
| Alt komut | Ne yapar |
|---|---|
install | Pre-commit kancasını kurar |
uninstall | SealBox kancasını kaldırır |
status [--json] | Kanca kurulu mu? |
run | Kancanın çalıştırdığı kontrol (elle de çalıştırılabilir) |
$ sealbox hook install $ sealbox hook status
Ne bulunur, ne yapılır
| Ne bulundu | Ne yapılır |
|---|---|
Parola / token / API anahtarı, tam bir string literal (.py, .js, .ts, .java…) | Kasaya taşınır. os.environ["DB_PASSWORD"] / process.env.DB_PASSWORD / System.getenv("DB_PASSWORD") olur |
| Aynı değerin yorumdaki tekrarı | Yer tutucuyla karalanır |
| E-posta, TCKN, telefon, IBAN, isim | Yer tutucuyla karalanır. Program kullanıyorsa vault expose ile ortam değişkeni olur |
.env | Gizli satırlar kasaya taşınır. .env silinir, yerine yalnızca yer tutucu içeren .env.sealed kalır |
| JSON / YAML / TOML ayar dosyası | Karalanır. Uygulamanın değeri hangi ortam değişkeninden okuması gerektiği raporlanır |
| Daha büyük bir metnin parçası (ör. URL içinde) ya da desteklenmeyen dil | Dokunulmaz, [!] uyarısı. Elle taşınmalı |
| Karalaması doğrulanamayan dosya | Dokunulmaz, [!] uyarısı. Taramanın geri kalanı devam eder |
Doğrulayıcılar
Yanlış alarmı azaltmak için eşleşmeler doğrulanır: T.C. kimlik no algoritması, e-posta, telefon, Luhn (kart), IBAN (mod-97) ve entropi. Yer tutucular __SECURE_<KATEGORİ>_<128 bit>__ biçimindedir.
Anahtar hiyerarşisi
Kasa anahtarı (DEK) tek bir yerde durursa, o yer kaybolduğunda kasa açılamaz. Bu yüzden DEK'in birden fazla kilidi vardır (zarf şifreleme, envelope encryption):
Kurtarma kodu (128 bit) ─Argon2id (64 MiB, t=3, p=4)─► Recovery KEK = X25519 ─┐ GitHub SSH anahtarı (ed25519→X25519 ya da RSA-OAEP) ───────────────────────────┼─► DEK ─► kasa Windows kimlik deposu (önbellek) ──────────────────────────────────────────────┘
- Kasa şifrelemesi: AES-256-GCM, rastgele nonce, tekrar engeli, AAD.
- DEK nerede: İşletim sisteminin kimlik deposunda (
keyring). Windows'ta Kimlik Bilgisi Yöneticisi'nde sealbox adıyla, macOS'ta Anahtar Zinciri'nde, Linux'ta Secret Service'te. Diskte yoktur. - Kilit açma sırası: Windows deposu → (ekip varsa) SSH anahtarı → hata ve kurtarma önerisi.
- Anahtar yenilendiyse: Başka bir sahip anahtarı yenilediyse (
dek_iduyuşmazsa) yenisi SSH ile alınır.
Repoya ne girer
| Dosya | Repoya | Açıklama |
|---|---|---|
.sealbox/project.vault | girer | Şifreli kasa |
.sealbox/project.names | girer | Değişken adları ve kategoriler (değer yok). vault list kasayı açmadan bunu okur |
.sealbox/project.masked | girer | Adı olmayan karalanmış kayıtların yer tutucuları |
.sealbox/team.json | girer | Üyeler, roller, kişi başı kilitli DEK kopyaları |
| Yedekler, kilit dosyaları | girmez | .sealbox/.gitignore dışarıda bırakır |
~/.sealbox/recovery/ | girmez | Kullanıcı klasöründe, proje dışında |
Dikkat: Kök .gitignore tüm .sealbox/ klasörünü dışlıyorsa team komutları ve status uyarır. Kasa eklenmeden önce commit edilmiş sırlar git geçmişinde kalır, değiştirilmeleri gerekir.
Yapılandırma: sealbox.toml
sealbox.example.toml dosyasını proje köküne sealbox.toml olarak kopyalayın ya da --config ile verin. Bu dosyaya asla gerçek sır yazmayın.
max_file_bytes = 524288 # Varsayılan hariç tutmaları (.env, *.pem, .git/** ...) açıkça aşmak için: explicit_includes = [".env.example"] [scanner] # İsimler regex ile güvenilir bulunamaz: karalanacak isimleri açıkça listeleyin. person_names = [] # Yanlış pozitifleri bastırmak için tam değerler: allow_values = [] disabled_rules = [] [[scanner.custom_rules]] id = "proje-kodu" category = "CUSTOM" pattern = 'PRJ-\d{6}' file_globs = ["*.py", "*.md"]
| Alan | Varsayılan | Açıklama |
|---|---|---|
excludes | .env, *.pem, *.key, id_rsa*, .git/**, .venv/**, node_modules/**, build/**, .ssh/**… | Hassas yollar. Taranmaz ve yazılmaz (.env ayrıca ele alınır) |
explicit_includes | [] | Hariç tutmayı bilinçli olarak aşmak için |
max_file_bytes | 512 KiB | Bundan büyük dosyalar atlanır |
scanner.person_names | [] | Karalanacak isimler |
scanner.custom_rules | Kural ekleme (id, category, pattern, file_globs) | |
scanner.disabled_rules | [] | Kural kapatma |
scanner.allow_values | [] | Yanlış pozitif bastırma (tam değer) |
Eski sürümden kalan [provider], [policy], share_dirs, audit_log_file ve max_files_per_job ayarları yok sayılır.
VS Code eklentisi
Eklenti sealbox komutunun editördeki kumandasıdır. İşin hepsini komut yapar. Marketplace ya da Open VSX ya da:
$ code --install-extension sealbox-0.3.0.vsix
Ayarlar
| Ayar | Varsayılan | Açıklama |
|---|---|---|
sealbox.executable | "" | sealbox programının yolu. Boşsa önce projedeki .venv, sonra PATH aranır. Eski secureProxy.executable da okunur. |
sealbox.checkOnSave | true | Dosya açılınca ve kaydedilince açık sır var mı diye bak. |
Özellikler
| Özellik | Ne yapar |
|---|---|
| Açık sır uyarısı | Dosya açılınca ya da kaydedilince seal --check çalışır, sır olan yer sarı çizilir |
| Hızlı düzeltme | Ampul → "Bu dosyadaki sırları kasaya taşı" |
| Üzerine gelince | __SECURE_..__, os.environ["X"], process.env.X, System.getenv("X") → "Değeri göster" (onaylı) |
| Çalışırken ver | Karalanmış verinin üzerinde ampul ya da hover → vault expose |
| Durum çubuğu | 🔒 3 sır kasada · 👥 2 kişi. Kurtarma yoksa ⚠ yedeksiz |
| Kasayla çalıştır | Komutu terminalde sealbox exec ile başlatır (her seferinde onay) |
| Düz çalıştırma uyarısı | ▶ ile çalışan program kasadaki bir değişken için KeyError verirse "Kasayla çalıştır" önerilir |
| Ekip ve kurtarma | Menüden ekip kur, kişi ekle ya da çıkar. Kurtarma kodu, parçalar, kit, geri açma. Anahtar kayıpsa bu seçenekler kendiliğinden sunulur |
Gösterilen değer yalnızca kapanan bir pencerede görünür. "Kopyala" denirse pano 30 saniye sonra temizlenir. Menü başlıkları VS Code'un diline göre Türkçe ya da İngilizcedir.
Neyi gösterir, neyi göstermez
Gösterir
Dosya yolu, kategori adları ve sayıları, satır/sütun, değişken adları, yer tutucu etiketleri, hata türü.
Asla göstermez
Gizli değerler (yalnızca onay penceresinde, istenirse), kasa anahtarı, kurtarma kodu ve parçaları (yalnızca pencerede), yabancı istisna mesajları (yalnızca tür adı).
Python logging kayıtları ayrıca sızıntı süzgecinden geçirilir.
Bilinen sınırlamalar
- Regex her sırrı bulamaz. Sıra dışı biçimdeki parolalar; parçalanmış, birleştirilmiş, kodlanmış (
\u0040, hex, ROT13) ya da doğal dil içindeki sırlar kaçırılabilir. Raporu inceleyin, gerekirsecustom_rulesekleyin. - İsim tespiti güvenilir değildir. Yalnızca
person_nameslistesi ve isteğe bağlıDetectoreklentileri (ör. bir NER modeli) kullanılır. - Kısa değerler (1–2 karakter) güvenilir şekilde korunamaz.
- Bellekten kesin silme garanti edilemez. Anahtar
bytearrayolarak tutulup iş sonunda sıfırlanır, ama Python kopya oluşturabilir. Swap ve crash dump'lar risk olarak kalır. - Tehdit modeli: Asıl hedef olan "ajan dosyayı okuyup buluta gönderir" senaryosunu kapatır. Kullanıcıyla aynı hesapta çalışan, kasıtlı olarak kötü niyetli bir program kimlik deposunu doğrudan okumaya uğraşırsa engel tam değildir.
- Çıktı süzgeci ters çevrilmiş ya da parçalanmış yazdırmayı yakalamaz. Asıl koruma onay penceresidir.
- Ekipten çıkarılan üye git geçmişindeki eski kasayı eski DEK ile açabilir.
team removebu değerleri listeler, onları servislerinden yenileyin.
Mimari
dosya ──► SafeFS ──► Scanner ──► Sealer ──────────► dosya (os.environ["X"] / __SECURE_..__)
yol/symlink regex + kasaya taşı / │
kontrolü doğrulayıcı karala ▼
.sealbox/project.vault (AES-256-GCM)
anahtar: kimlik deposu / SSH / kurtarma kodu
exec ──► onay penceresi ──► sırlar ortam değişkeni olarak ──► program (çıktısı süzülür)
sealbox/
├── __main__.py CLI: komutlar, yardım metinleri ve örnekler
├── cli_help.py Yardım altyapısı, "bunu mu demek istediniz"
├── i18n.py, i18n_en.py Türkçe / İngilizce
├── status.py init / status kontrol listesi
├── config.py Pydantic yapılandırma + güvenli varsayılanlar
├── vaultstore.py Proje kasası ve anahtarın açılması
├── runner.py exec, vault reveal/set/expose/remove
├── team.py GitHub SSH ile ekip paylaşımı (team.json)
├── recovery.py Kurtarma kodu, 2-of-3 parçalar, kit
├── approval.py Onay ve gizli değer pencereleri
├── sealing/
│ ├── sealer.py Kasaya taşıma / karalama planı
│ ├── rewriters.py Literal → ortam değişkeni (Python, JS/TS, Java)
│ └── file_operations.py SafeFS: yol güvenliği, kilit, atomik yazma
└── core/
├── scanner.py Regex kuralları + Detector eklenti arayüzü
├── validators.py TCKN, e-posta, telefon, Luhn, IBAN, entropi
├── tokenization.py __SECURE_..__ yer tutucular
├── crypto.py AES-256-GCM
├── envelope.py DEK kilitleri: Argon2id, X25519, SSH
├── key_sharing.py SLIP-39 Shamir parçalama
└── leak_guard.py Çıktı ve loglarda sır gizleme
Eski addan (secure-ai-proxy) geçiş
Hiçbir şey yapmana gerek yok:
- Eski
.secure_proxy/kasa klasörleri ve~/.secure_proxy/kurtarma klasörü olduğu gibi çalışır. Yeni projeler.sealbox/kullanır. - Kimlik Bilgileri Yöneticisi'ndeki eski
secure-ai-proxykaydı, kasa ilk açıldığındasealboxadına taşınır ve eskisi silinir. secure_proxy.tomlhâlâ okunur (sealbox.tomlönceliklidir).secure-ai-proxykomutu da bir süre daha çalışır.
Geliştirme
$ pip install -e ".[dev]" $ pytest -q $ ruff check sealbox tests $ mypy sealbox $ cd vscode-extension && npm install && npm test
Yeni bir mesaj eklerken metni _("...") ile sarıp İngilizcesini sealbox/i18n_en.py'ye yazın. tests/test_i18n.py eksik çeviriyi yakalar. CI: Ubuntu + Windows, Python 3.12/3.13.