0Pricing
DevOps Bootcamp · Ders

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>/cmdline ve 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_history içine kaydedilir.
  • Günlük dosyaları: set -x izleri, 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çin printf '%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_TOKEN

Dosyalardaki 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 .gitignore olmadan 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_TOKEN

curl 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 s3cr3t

En iyi uygulamalar:

  • Her zaman chmod 0600 ~/.netrc ayarı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/netrc kullanın.
  • Geçici netrc dosyalarını EXIT üzerinde bir trap ile 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 -i veya satır içi atama kullanarak belirli komutlara aktarın.
  • Gizli bir değişkeni asla export etmeyin — mümkün olduğunda yalnızca atama yapın (export kullanmayı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_password

Gizli 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/null kullanarak izlemeyi geçici olarak devre dışı bırakın.
  • Ardından set -x ile 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'   # unchanged

env -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_TOKEN

tmpfs Ü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/shm ve /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 EXIT ile birlikte kullanın.
  • Kapsayıcılarda (Docker, Kubernetes), gizli bilgiler doğrudan /run/secrets iç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 shredded

Hepsini 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:

  • -s ile stdin okuma — terminal yankısı yok
  • trap ile 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 aux ve /proc/<pid>/cmdline içinde görünür. Bunun yerine stdin üzerinden yönlendirme veya --netrc-file kullanın.
  • stdin okumaları: Gizli bilgileri terminal yankısı veya kabuk geçmişine maruz bırakmadan etkileşimli olarak almak için read -rs kullanın.
  • Dosya izinleri: Gizli bilgi dosyaları chmod 0600 (veya 0400) olmalıdır. Atomik oluşturma için install -m 0600 kullanın.
  • netrc dosyaları: Kimlik bilgilerini --netrc-file ile gösterilen geçici bir dosyaya yönlendirin; trap EXIT ile temizleyin.
  • Ortamı güvenli kullanma: Yerel olarak aldıktan sonra gizli bilgi içeren ortam değişkenlerini hemen unset edin; gereksiz yere asla export etmeyin; alt işlemleri yalıtmak için env -i kullanın.
  • xtrace koruması: Hata ayıklama izlerinin değerleri sızdırmasını önlemek için hassas kodu { set +x; } 2>/dev/null ... set -x içine alın.
  • Günlük maskeleme: Son çare güvenlik ağı olarak sed tabanlı bir günlükleyici kullanın.
  • tmpfs: Çalışma zamanı gizli bilgilerini diske hiç dokunmamaları için /run/user/$UID veya /dev/shm iç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

  1. Komut ve Bağımsız Değişken Enjeksiyonunu Önleme
  2. Güvenli Gizli Bilgi Yönetimi ve Ortam Hijyeni
  3. En Az Ayrıcalıklı Çalıştırma ve sudo Disiplini
  4. ShellCheck ile Statik Analiz ve Denetim
← DevOps Bootcamp Sayfasına Dön