Güvenli Gizli Bilgi Yönetimi ve Ortam Hijyeni
Kimlik bilgilerini stdin, dosyalar ve temizlenmiş ortamlar kullanarak işlem listelerinden ve günlüklerden uzak tutun.
Güvenli Gizli Bilgi Yönetimi ve Ortam Hijyeni, CoddyKit'te ücretsiz bir DevOps Bootcamp dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DevOps Bootcamp öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DevOps Bootcamp kursu toplamda 4 dersten oluşur.
Gizli Bilgilerin Korunması Neden Önemlidir
Gizli bilgiler — API anahtarları, parolalar, belirteçler — her sistemdeki en hassas verilerdir. Bunları Bash betiklerinde yanlış ele almak, en yaygın ve en zararlı güvenlik hatalarından biridir.
- Süreç listeleri: Komutlara geçirilen bağımsız değişkenler
ps aux,/proc/<pid>/cmdlineve sistem denetim günlüklerinde görünür; ana bilgisayardaki tüm kullanıcılar bunları görebilir. - Kabuk geçmişi: Etkileşimli olarak yazılan komutlar (bazen betikler de)
~/.bash_historyiçine kaydedilir. - Günlük dosyaları:
set -xizleri, uygulama günlükleri ve CI/CD çıktısı değişken değerlerini yakalayabilir. - Ortam sızıntısı: Alt süreçler, dışa aktarılmış gizli bilgiler de dahil olmak üzere üst süreçlerinin tüm ortamını devralır.
Güçlendirilmiş bir betik, gizli bilgileri radyoaktif madde gibi ele alır: maruz kalma süresini en aza indirir, saldırı yüzeyini sınırlar ve dışarı aktarırken her şeyi temizler.
Süreç Listesinin Saldırı Yüzeyi
Bir gizli bilgiyi komut satırı bağımsız değişkeni olarak geçirdiğinizde sistemdeki her kullanıcı bunu ps aracılığıyla hemen okuyabilir. Bu kuramsal bir durum değildir; paylaşımlı barındırma ve kapsayıcı ortamlarında düzenli olarak istismar edilir.
Aşağıdaki kod parçası sorunu ve çözümü yan yana gösterir.
#!/usr/bin/env bash
# DANGEROUS: password visible in 'ps aux' output
# curl -u "admin:SuperSecret123" https://api.example.com/data
# SAFE: pass credentials via stdin or a flag that reads from a file
# Many tools support reading secrets from stdin with '-' or dedicated flags:
# Option 1 — pipe the secret so it never appears in argv
echo 'SuperSecret123' | curl -u 'admin' --password-stdin \
https://api.example.com/data 2>/dev/null || true
# Option 2 — write a temporary netrc and point curl at it
# (covered in a later scene)
echo 'Secret never touches the command line this way'Gizli Bilgileri standart girdiden okuma
En güvenli etkileşimli yöntem, read -rs kullanarak gizli bilgiyi çalışma zamanında okumaktır. -s seçeneği ekrana yazdırmayı bastırır; böylece karakterler hiçbir zaman görüntülenmez. -r ise ters eğik çizginin yorumlanmasını önler.
Önemli noktalar:
- Değişken dışa aktarılmaz; bu nedenle alt süreçler onu
/proc/<pid>/environüzerinden göremez. - Kullandıktan sonra maruz kalma aralığını daraltmak için değişkeni hemen unset edin.
echo "$SECRET"kullanmaktan kaçının; değerin sonuna satır sonu eklenerek bozulmasını önlemek ve izlerde görünmez kalmak içinprintf '%s'kullanın.
#!/usr/bin/env bash
set -euo pipefail
# Prompt on stderr so stdout stays clean for piping
read -rsp 'Enter API token: ' API_TOKEN <&2
printf '\n' >&2
# Use the secret — printf keeps it out of argv
response=$(printf '%s' "$API_TOKEN" | curl -sS -X POST \
-H 'Content-Type: application/json' \
--data-binary @- \
https://httpbin.org/post 2>/dev/null) || true
echo "Request sent."
# Scrub immediately — unset removes it from shell memory
unset API_TOKENDosyalardaki Gizli Bilgiler: İzinler ve Sahiplik
Bir gizli bilginin diskte kalıcı olması gerektiğinde (örneğin bir hizmet hesabı anahtarı), dosyanın izinleri birincil savunmanızdır.
- Mod 0600 — yalnızca sahibi tarafından okunabilir ve yazılabilir. Grup ve diğer kullanıcıların erişimi yoktur.
- Mod 0400 — sahibi için salt okunurdur. Yanlışlıkla üzerine yazmamanız gereken anahtarlar için bunu tercih edin.
- Gizli bilgi dosyalarını
~/.secrets/veya/run/secrets/gibi özel bir dizinde saklayın (ikincisi birçok Linux sisteminde RAM destekli bir tmpfs'tir ve yalnızca yeniden başlatılana kadar varlığını sürdürür). - Sağlam bir
.gitignoreolmadan gizli bilgi dosyalarını git tarafından izlenen bir dizine asla yerleştirmeyin.
#!/usr/bin/env bash
set -euo pipefail
SECRETS_DIR="${HOME}/.secrets"
mkdir -p "$SECRETS_DIR"
chmod 700 "$SECRETS_DIR" # directory: only owner can list contents
KEY_FILE="${SECRETS_DIR}/api_token"
# Write secret — atomically restrict permissions before writing content
install -m 0600 /dev/null "$KEY_FILE"
printf '%s' 'my-super-secret-token' > "$KEY_FILE"
echo "Permissions:"
ls -la "$KEY_FILE"
# Read back safely — no subshell, no echo
API_TOKEN=$(< "$KEY_FILE")
echo "Token length: ${#API_TOKEN} chars (value not printed)"
unset API_TOKENcurl ile .netrc Dosyası Kullanma
curl, makine adlarını kimlik bilgileriyle eşleyen bir ~/.netrc dosyasını (veya --netrc-file aracılığıyla herhangi bir yolu) destekler. Bu sayede kimlik doğrulama verileri komut satırından ve betik gövdesinden tamamen uzak tutulur.
Dosya biçimi basittir:
machine api.example.com
login admin
password s3cr3tEn iyi uygulamalar:
- Her zaman
chmod 0600 ~/.netrcayarını yapın — bazı sistemlerde curl, dosya herkes tarafından okunabiliyorsa dosyayı reddeder. - tmpfs destekli veya kapsayıcıya eklenmiş bir gizli bilgiye işaret etmek için
--netrc-file /run/secrets/netrckullanın. - Geçici netrc dosyalarını EXIT üzerinde bir
trapile temizleyin.
#!/usr/bin/env bash
set -euo pipefail
TMP_NETRC=$(mktemp)
chmod 0600 "$TMP_NETRC"
# Trap ensures cleanup even on error or signal
trap 'rm -f "$TMP_NETRC"' EXIT
# Write credentials to the temp netrc
cat > "$TMP_NETRC" <<'EOF'
machine httpbin.org
login myuser
password mypassword
EOF
curl -fsS --netrc-file "$TMP_NETRC" \
https://httpbin.org/basic-auth/myuser/mypassword \
-o /dev/null -w 'HTTP %{http_code}\n' || true
# trap fires here: $TMP_NETRC is deleted
echo 'Temp netrc cleaned up by trap.'Ortam Değişkenlerini Güvenli Kullanma
Ortam değişkenleri, gizli bilgileri betiklere aktarmanın popüler bir yoludur (12 faktörlü uygulamalar, CI/CD işlem hatları). Ancak bunlar her alt işleme sızar ve işlem ömrü boyunca /proc/<pid>/environ içinde görünür.
Savunma amaçlı kalıplar:
- Gizli bilgiyi hemen yerel bir değişkene aktarın ve ortam değişkenini kaldırın; böylece alt işlemler onu devralamaz.
- Gizli bilgileri, devralınan ortamın tamamı yerine
env -iveya satır içi atama kullanarak belirli komutlara aktarın. - Gizli bir değişkeni asla
exportetmeyin — mümkün olduğunda yalnızca atama yapın (exportkullanmayın).
#!/usr/bin/env bash
set -euo pipefail
# Simulate a secret arriving via environment (e.g., from CI system)
export DB_PASSWORD='hunter2' # set by CI — we did not choose this
# Capture locally, then strip from environment immediately
db_password="$DB_PASSWORD"
unset DB_PASSWORD
# Verify the env var is gone before spawning any child process
if printenv DB_PASSWORD 2>/dev/null; then
echo 'ERROR: DB_PASSWORD still in environment!' >&2
exit 1
fi
echo 'Secret captured and env var scrubbed.'
echo "Password length: ${#db_password}"
unset db_passwordGizli Bilgilerin set -x İzlerinde Görünmesini Önleme
set -x (xtrace), hata ayıklama için çok değerlidir; ancak gizli bilgiler de dahil olmak üzere genişlettiği her değişkenin değerini stderr'a yazdırır. Bu izler çoğu zaman CI günlüklerine veya syslog'a ulaşır.
İzlemeyi yararlı tutarken gizli bilgileri koruma stratejileri:
- Hassas işlemlerin çevresinde
{ set +x; } 2>/dev/nullkullanarak izlemeyi geçici olarak devre dışı bırakın. - Ardından
set -xile yeniden etkinleştirin. - xtrace çıktısını genel günlük akışına değil, korumalı bir günlük dosyasına giden ayrı bir dosya tanımlayıcısına yönlendirin.
#!/usr/bin/env bash
set -euo pipefail
set -x # tracing ON — safe for non-sensitive sections
echo 'Building application...'
SRC_DIR='/tmp/build'
mkdir -p "$SRC_DIR"
# Disable xtrace around secret handling (suppress the set +x line itself)
{ set +x; } 2>/dev/null
read -rsp 'Token (hidden from trace): ' SECRET_TOKEN <&2
printf '\n' >&2
token_len=${#SECRET_TOKEN}
unset SECRET_TOKEN
set -x # tracing back ON
echo "Token captured (length=$token_len). Continuing build..."
ls "$SRC_DIR"Günlük Dosyalarındaki Gizli Bilgileri Temizleme
Dikkatli olsanız bile gizli bilgiler bazen günlük çıktısına sızar — özellikle ayrıntılı veya eski betiklerde. Bilinen kalıpları maskeleyen bir günlükleme sarmalayıcı işlevi ek bir güvenlik katmanı sağlar.
Bu kalıp, tüm günlük çıktısında düzenli ifade tabanlı bir değiştirme kullanır. Bu, daha önce ele alınan diğer güvenli kullanım uygulamalarının yerine geçmez; son çare katmanıdır.
#!/usr/bin/env bash
set -euo pipefail
# A logging function that scrubs common secret patterns before writing
log() {
local line
# Replace anything that looks like key=VALUE or password=VALUE
line=$(printf '%s\n' "$*" \
| sed -E 's/(password|token|secret|key)=[^[:space:]]*/\1=***REDACTED***/gi')
printf '[%s] %s\n' "$(date -u '+%T')" "$line"
}
# Usage:
log 'Connecting to database with password=hunter2'
log 'Loaded API token=sk-abc123xyz secret'
log 'Build step completed successfully' # unchangedenv -i ile Yalıtılmış Ortamlar
env -i, bir komutu tamamen boş bir ortamla başlatır ve yanlışlıkla eklenmiş gizli bilgiler de dahil olmak üzere devralınan değişkenlerin alt işleme ulaşmasını önler. Ardından yalnızca gerekenleri açıkça aktarırsınız.
Bu, özellikle güvenilmeyen betikleri, derleme araçlarını veya ortam verilerini dışarı sızdırabilecek üçüncü taraf yardımcı programlarını çalıştırırken kullanışlıdır.
#!/usr/bin/env bash
set -euo pipefail
# Polluted parent environment (simulating a CI runner)
export AWS_SECRET_ACCESS_KEY='AKIAIOSFODNN7EXAMPLE'
export GITHUB_TOKEN='ghp_faketoken123'
export HOME="$HOME"
export PATH="$PATH"
echo '--- Child sees full environment:'
env | grep -E 'AWS|GITHUB' | head -5
echo '--- Sanitised child (env -i) sees nothing secret:'
env -i HOME="$HOME" PATH="$PATH" TERM="${TERM:-dumb}" \
bash -c 'env | grep -E "AWS|GITHUB" || echo "No secrets visible"'
unset AWS_SECRET_ACCESS_KEY GITHUB_TOKENtmpfs Üzerinde Geçici Gizli Bilgi Dosyaları
tmpfs, RAM destekli bir dosya sistemidir. Buraya yazılan dosyalar diske hiçbir zaman aktarılmaz; böylece gizli bilgilerin takas alanında, disk önbelleğinde veya anlık görüntülerde kalma riski ortadan kalkar.
- Linux'ta
/dev/shmve/run/user/<uid>genellikle tmpfs bağlama noktalarıdır. - Dosyaları betik tamamlandığında silmek için tmpfs kullanımını her zaman bir
trap EXITile birlikte kullanın. - Kapsayıcılarda (Docker, Kubernetes), gizli bilgiler doğrudan
/run/secretsiçine tmpfs birimleri olarak bağlanabilir.
#!/usr/bin/env bash
set -euo pipefail
# Prefer /run/user/$UID (user-owned tmpfs) or /dev/shm (world-readable dir!)
if [[ -d "/run/user/$UID" ]]; then
TMPFS_DIR="/run/user/$UID"
elif [[ -d '/dev/shm' ]]; then
TMPFS_DIR='/dev/shm'
else
# Fallback: warn that disk will be used
echo 'WARNING: No tmpfs available; using /tmp (disk-backed)' >&2
TMPFS_DIR='/tmp'
fi
SECRET_FILE=$(mktemp "${TMPFS_DIR}/secret.XXXXXX")
chmod 0600 "$SECRET_FILE"
trap 'shred -u "$SECRET_FILE" 2>/dev/null || rm -f "$SECRET_FILE"' EXIT
printf '%s' 'my-runtime-token' > "$SECRET_FILE"
echo "Secret stored in: $SECRET_FILE"
df -T "$SECRET_FILE" | awk 'NR==2 {print "Filesystem type:", $2}'
# Use the secret...
token=$(< "$SECRET_FILE")
echo "Token length: ${#token}"
unset token
# trap fires on exit: file shreddedHepsini Bir Araya Getirme: Güçlendirilmiş Dağıtım Betiği
Aşağıdaki betik, bu dersteki her tekniği gerçekçi bir dağıtım yardımcısında birleştirir. Her savunma katmanının diğerlerini nasıl güçlendirdiğine dikkat edin:
-sile stdin okuma — terminal yankısı yoktrapile temizlenen tmpfs gizli bilgi dosyası- ortam temizleme — herhangi bir alt işlemden önce gizli bilgi kaldırılır
- xtrace koruması — hassas kod çevresinde izleme duraklatılır
- günlük maskeleme — günlüğe yazmadan önce güvenlik ağı düzenli ifadesi uygulanır
#!/usr/bin/env bash
set -euo pipefail
### 1. Redacting logger
log() {
local msg
msg=$(printf '%s' "$*" \
| sed -E 's/(password|token|secret|key)=[^[:space:]]*/\1=***/gi')
printf '[%s] %s\n' "$(date -u +%T)" "$msg"
}
### 2. tmpfs secret store
TMPFS_DIR="${XDG_RUNTIME_DIR:-/tmp}"
SECRET_FILE=$(mktemp "${TMPFS_DIR}/deploy_token.XXXXXX")
chmod 0600 "$SECRET_FILE"
trap 'rm -f "$SECRET_FILE"; log "Secret file cleaned up."' EXIT
### 3. Read secret without trace
{ set +x; } 2>/dev/null
read -rsp 'Deploy token: ' _tok <&2; printf '\n' >&2
printf '%s' "$_tok" > "$SECRET_FILE"
unset _tok
set -x
### 4. Scrub inherited env vars before subprocess
unset DEPLOY_TOKEN 2>/dev/null || true
log 'Starting deployment...'
# Simulate deploy using secret from file (token never in argv)
# curl -H "Authorization: Bearer $(< $SECRET_FILE)" https://api.example.com/deploy
log 'Deployment complete. token=hidden_by_redactor'
echo 'Done.'Bilgi Kontrolü: İşlem Listeleri Yoluyla Gizli Bilgi Açığa Çıkması
Gizli bilgilerin işlem listeleri üzerinden nasıl sızdığını ve bunun nasıl önleneceğini anlayıp anlamadığınızı sınayın.
Ders Özeti: Gizli Bilgileri Güvenli İşleme
Gizli Bilgileri Güvenli İşleme ve Ortamı Güvenli Kullanma dersini tamamladınız. Ele alınan konuların kısa bir özeti:
- İşlem listeleri: Gizli bilgileri asla komut satırı bağımsız değişkenleri olarak aktarmayın — bunlar
ps auxve/proc/<pid>/cmdlineiçinde görünür. Bunun yerine stdin üzerinden yönlendirme veya--netrc-filekullanın. - stdin okumaları: Gizli bilgileri terminal yankısı veya kabuk geçmişine maruz bırakmadan etkileşimli olarak almak için
read -rskullanın. - Dosya izinleri: Gizli bilgi dosyaları
chmod 0600(veya0400) olmalıdır. Atomik oluşturma içininstall -m 0600kullanın. - netrc dosyaları: Kimlik bilgilerini
--netrc-fileile gösterilen geçici bir dosyaya yönlendirin;trap EXITile temizleyin. - Ortamı güvenli kullanma: Yerel olarak aldıktan sonra gizli bilgi içeren ortam değişkenlerini hemen
unsetedin; gereksiz yere aslaexportetmeyin; alt işlemleri yalıtmak içinenv -ikullanın. - xtrace koruması: Hata ayıklama izlerinin değerleri sızdırmasını önlemek için hassas kodu
{ set +x; } 2>/dev/null ... set -xiçine alın. - Günlük maskeleme: Son çare güvenlik ağı olarak
sedtabanlı bir günlükleyici kullanın. - tmpfs: Çalışma zamanı gizli bilgilerini diske hiç dokunmamaları için
/run/user/$UIDveya/dev/shmiçinde saklayın; çıkışta parçalayarak silin.
Derinlemesine savunma temel yaklaşımdır: tek bir önlem yeterli değildir, ancak bunları katmanlı olarak birlikte kullanmak gizli bilgilerin sızmasını son derece zorlaştırır.
Sıkça Sorulan Sorular
“Güvenli Gizli Bilgi Yönetimi ve Ortam Hijyeni” dersi ücretsiz mi?
Evet — “Güvenli Gizli Bilgi Yönetimi ve Ortam Hijyeni” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DevOps Bootcamp kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DevOps Bootcamp kursu toplamda 4 dersten oluşur.
“Güvenli Gizli Bilgi Yönetimi ve Ortam Hijyeni” dersinde ne öğreneceğim?
Kimlik bilgilerini stdin, dosyalar ve temizlenmiş ortamlar kullanarak işlem listelerinden ve günlüklerden uzak tutun. DevOps Bootcamp ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
DevOps Bootcamp öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te DevOps Bootcamp, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Güvenli Gizli Bilgi Yönetimi ve Ortam Hijyeni” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu DevOps Bootcamp dersinde kod yazıp çalıştırabilir miyim?
Evet. Her DevOps Bootcamp dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Komut ve Bağımsız Değişken Enjeksiyonunu Önleme
- Güvenli Gizli Bilgi Yönetimi ve Ortam Hijyeni
- En Az Ayrıcalıklı Çalıştırma ve sudo Disiplini
- ShellCheck ile Statik Analiz ve Denetim