Salaisten tietojen turvallinen käsittely ja ympäristön siisteys
Pidä tunnistetiedot poissa prosessiluetteloista ja lokeista käyttämällä vakiolaitesyötettä, tiedostoja ja puhdistettuja ympäristöjä.
Salaisten tietojen turvallinen käsittely ja ympäristön siisteys on ilmainen DevOps-bootcamp-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu DevOps-bootcamp-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. DevOps-bootcamp-kurssilla on yhteensä 4 oppituntia.
Miksi salaisuuksien turvallinen käsittely on tärkeää
Salaisuudet — API-avaimet, salasanat ja tunnukset — ovat minkä tahansa järjestelmän arkaluonteisinta dataa. Niiden virheellinen käsittely Bash-skripteissä on yksi yleisimmistä ja haitallisimmista tietoturvavirheistä.
- Prosessiluettelot: Komentoina välitetyt argumentit näkyvät komennoissa
ps auxja/proc/<pid>/cmdlinesekä järjestelmän auditointilokeissa — kaikille isäntäkoneen käyttäjille. - komentotulkin historia: Interaktiivisesti kirjoitetut komennot (ja joskus skriptit) tallennetaan tiedostoon
~/.bash_history. - Lokitiedostot:
set -x-jäljet, sovelluslokit ja CI/CD-tulosteet voivat sisältää muuttujien arvoja. - Ympäristön vuotaminen: Lapsiprosessit perivät koko emoprosessinsa ympäristön, mukaan lukien viedyt salaisuudet.
Vahvistettu skripti käsittelee salaisuuksia kuin radioaktiivista ainetta — minimoi altistusajan, rajoita altistuvaa pinta-alaa ja puhdista kaikki ulospäin välitettävä.
Prosessiluetteloiden hyökkäyspinta
Kun välitätte salaisuuden komentoriviargumenttina, jokainen järjestelmän käyttäjä voi lukea sen heti komennolla ps. Tämä ei ole teoreettinen uhka — sitä hyödynnetään säännöllisesti jaetuissa palveluympäristöissä ja konttiympäristöissä.
Alla oleva koodikatkelma havainnollistaa ongelman ja korjauksen rinnakkain.
#!/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'Salaisuuksien lukeminen vakiotulosteesta
Turvallisin interaktiivinen tapa on lukea salaisuus suorituksen aikana komennolla read -rs. Valitsin -s estää kaiutuksen, joten merkit eivät näy koskaan, ja -r estää kenoviivojen tulkinnan.
Keskeiset kohdat:
- Muuttujaa ei viedä ympäristöön, joten lapsiprosessit eivät voi nähdä sitä tiedoston
/proc/<pid>/environkautta. - Käytön jälkeen poistakaa muuttuja heti komennolla
unset, jotta altistusaika lyhenee. - Välttäkää komentoa
echo "$SECRET"— käyttäkää komentoaprintf '%s', jotta lopussa oleva rivinvaihto ei vääristä arvoa ja jotta arvo ei näy jäljityksissä.
#!/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_TOKENSalaisuudet tiedostoissa: käyttöoikeudet ja omistajuus
Kun salaisuus on säilytettävä levyllä (esimerkiksi palvelutilin avain), tiedoston käyttöoikeudet ovat ensisijainen suojakeinonne.
- Mode 0600 — vain omistaja voi lukea ja kirjoittaa. Ryhmällä tai muilla käyttäjillä ei ole käyttöoikeutta.
- Mode 0400 — omistajalla on vain lukuoikeus. Suosikaa tätä avaimille, joita ei pidä koskaan vahingossa ylikirjoittaa.
- Säilyttäkää salaisuustiedostot niille varatussa hakemistossa, kuten
~/.secrets/tai/run/secrets/(jälkimmäinen on monissa Linux-järjestelmissä RAM-muistiin perustuva tmpfs-tiedostojärjestelmä, ja sen sisältö säilyy vain uudelleenkäynnistykseen asti). - Älkää koskaan sijoittako salaisuustiedostoja git-seurattuun hakemistoon ilman erittäin luotettavaa
.gitignore-tiedostoa.
#!/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.netrc-tiedoston käyttö curl-komennon kanssa
curl tukee ~/.netrc-tiedostoa (tai mielivaltaista polkua parametrilla --netrc-file), joka yhdistää isäntänimet tunnistetietoihin. Näin todennustiedot pysyvät kokonaan poissa komentoriviltä ja komentosarjan rungosta.
Tiedostomuoto on yksinkertainen:
machine api.example.com
login admin
password s3cr3tParhaat käytännöt:
- Asettakaa aina
chmod 0600 ~/.netrc— curl kieltäytyy käyttämästä tiedostoa joissakin järjestelmissä, jos kaikki käyttäjät voivat lukea sitä. - Osoittakaa tmpfs-pohjaiseen tai säilöön injektoituun salaisuuteen parametrilla
--netrc-file /run/secrets/netrc. - Poistakaa tilapäiset netrc-tiedostot
trap-käsittelijällä EXIT-tapahtuman yhteydessä.
#!/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.'Ympäristömuuttujien turvallinen käsittely
Ympäristömuuttujat ovat suosittu tapa välittää salaisuuksia komentosarjoihin (12-factor-sovellukset, CI/CD-putket). Ne kuitenkin vuotavat jokaiselle lapsiprosessille ja näkyvät tiedostossa /proc/<pid>/environ prosessin koko elinkaaren ajan.
Suojautumiskeinoja:
- Tuokaa salaisuus heti paikalliseen muuttujaan ja poistakaa ympäristömuuttuja käytöstä komennolla
unset, jotta lapsiprosessit eivät voi periä sitä. - Välittäkää salaisuudet vain tietyille komennoille käyttämällä komentoa
env -itai inline-määritystä koko perityn ympäristön sijaan. - Älkää koskaan käyttäkö
export-komentoa salaisuusmuuttujalle — käyttäkää mahdollisuuksien mukaan pelkkää sijoitusta ilmanexport-komentoa.
#!/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_passwordSalaisuuksien estäminen set -x -jäljityksessä
set -x (xtrace) on erittäin hyödyllinen virheenkorjauksessa, mutta se tulostaa jokaisen laajentamansa muuttujan arvon — myös salaisuudet — vakiovirheeseen. Nämä jäljitystiedot päätyvät usein CI-lokeihin tai syslogiin.
Strategioita salaisuuksien suojaamiseen jäljityksen ollessa käytössä:
- Poistakaa jäljitys tilapäisesti arkaluontoisten toimintojen ajaksi komennolla
{ set +x; } 2>/dev/null. - Ottakaa jäljitys uudelleen käyttöön komennolla
set -x. - Ohjatkaa xtrace-tuloste erilliseen tiedostokuvaajaan, joka vie tulosteen suojattuun lokitiedostoon eikä julkiseen lokivirtaan.
#!/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"Salaisuuksien poistaminen lokitiedostoista
Huolellisuudesta huolimatta salaisuuksia päätyy joskus lokitulosteeseen — etenkin monisanaisissa tai vanhoissa komentosarjoissa. Tunnetut kuviot peittävä lokituksen kääretoiminto tarjoaa lisäsuojan.
Tässä mallissa kaikkeen lokitulosteeseen käytetään säännöllisiin lausekkeisiin perustuvaa korvausta. Se on viimeinen suojakerros, ei korvike muille tässä oppitunnissa käsitellyille turvallisille käytännöille.
#!/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' # unchangedEristetyt ympäristöt env -i -komennolla
env -i käynnistää komennon täysin tyhjässä ympäristössä ja estää kaikkia perittyjä muuttujia — myös vahingossa välittyviä salaisuuksia — päätymästä lapsiprosessiin. Sen jälkeen välitätte erikseen vain tarvittavat muuttujat.
Tämä on erityisen hyödyllistä suoritettaessa epäluotettavia komentosarjoja, koontityökaluja tai kolmannen osapuolen apuohjelmia, jotka saattavat vuotaa ympäristötietoja.
#!/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_TOKENTilapäiset salaisuustiedostot tmpfs-tiedostojärjestelmässä
tmpfs on RAM-muistiin perustuva tiedostojärjestelmä. Sinne kirjoitettuja tiedostoja ei koskaan kirjoiteta levylle, mikä poistaa riskin salaisuuksien säilymisestä sivutuksessa, levyn välimuistissa tai vedoksissa.
- Linuxissa
/dev/shmja/run/user/<uid>ovat tyypillisesti tmpfs-liitoksia. - Yhdistäkää tmpfs:n käyttö aina
trap EXIT-käsittelijään, jotta tiedostot poistetaan komentosarjan päättyessä. - Säilöissä (Docker, Kubernetes) salaisuudet voidaan liittää tmpfs-taltiona suoraan hakemistoon
/run/secrets.
#!/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 shreddedKaiken yhdistäminen: suojattu käyttöönottokomentosarja
Seuraava komentosarja yhdistää kaikki tämän oppitunnin tekniikat realistiseksi käyttöönoton apuohjelmaksi. Huomioikaa, kuinka kukin suojakerros vahvistaa muita:
- stdin-luku parametrilla
-s— ei päätteen kaikuutusta - tmpfs-salaisuustiedosto ja
trap-siivous - Ympäristön puhdistus — salaisuus poistetaan ennen aliohjelman suorittamista
- xtrace-suoja — jäljitys keskeytetään arkaluontoisen koodin ympärillä
- Lokien peittäminen — turvaverkkona toimiva säännöllinen lauseke ennen lokiin kirjoittamista
#!/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.'Tietotarkistus: salaisuuden paljastuminen prosessiluettelossa
Testatkaa ymmärrystänne siitä, miten salaisuudet vuotavat prosessiluetteloiden kautta ja miten tämä voidaan estää.
Oppitunnin kertaus: salaisuuksien turvallinen käsittely
Olette suorittaneet oppitunnin Secure Secret Handling and Environment Hygiene. Tässä on tiivis yhteenveto kaikesta käsitellystä:
- Prosessiluettelot: Älkää koskaan välittäkö salaisuuksia komentoriviargumentteina — ne näkyvät komennoissa
ps auxja/proc/<pid>/cmdline. Käyttäkää sen sijaan stdin-putkea tai parametria--netrc-file. - stdin-luku: Käyttäkää komentoa
read -rssalaisuuksien lukemiseen vuorovaikutteisesti ilman päätteen kaikuutusta tai paljastumista komentohistoriassa. - Tiedostojen käyttöoikeudet: Salaisuustiedostojen oikeuksien on oltava
chmod 0600(tai0400). Käyttäkää atomiseen luontiin komentoainstall -m 0600. - netrc-tiedostot: Siirtäkää tunnistetiedot tilapäiseen tiedostoon, johon viitataan parametrilla
--netrc-file; poistakaa tiedosto komennollatrap EXIT. - Ympäristön turvallinen käsittely: Käyttäkää
unset-komentoa salaisuuksia sisältäville ympäristömuuttujille heti, kun olette tallentaneet niiden arvot paikallisesti. Älkää käyttäkö niille tarpeettomastiexport-komentoa; eristäkää lapsiprosessit komennollaenv -i. - xtrace-suoja: Ympäröikää arkaluontoinen koodi rakenteella
{ set +x; } 2>/dev/null ... set -x, jotta virheenkorjauksen jäljitystiedot eivät vuoda arvoja. - Lokien peittäminen: Käyttäkää
sed-pohjaista lokittajaa viimeisenä turvaverkkona. - tmpfs: Säilyttäkää ajonaikaiset salaisuudet hakemistoissa
/run/user/$UIDtai/dev/shm, jotta ne eivät koskaan päädy levylle; poistakaa ne komentosarjan päättyessä.
Syvyyssuuntainen puolustus on keskeinen ajattelutapa: mikään yksittäinen toimenpide ei riitä, mutta yhdessä käytettyinä ne tekevät salaisuuksien vuotamisesta erittäin vaikeaa.
Opi DevOps-bootcamp tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 142
- Oppitunnit
- 568
Usein kysytyt kysymykset
Onko oppitunti ”Salaisten tietojen turvallinen käsittely ja ympäristön siisteys” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa DevOps-bootcamp-oppimispolun 3 oppituntia, myös oppitunnin “Salaisten tietojen turvallinen käsittely ja ympäristön siisteys”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. DevOps-bootcamp-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Salaisten tietojen turvallinen käsittely ja ympäristön siisteys”?
Pidä tunnistetiedot poissa prosessiluetteloista ja lokeista käyttämällä vakiolaitesyötettä, tiedostoja ja puhdistettuja ympäristöjä. Harjoittelet DevOps-bootcamp-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni DevOps-bootcamp-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin DevOps-bootcamp-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Salaisten tietojen turvallinen käsittely ja ympäristön siisteys”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä DevOps-bootcamp-oppitunnilla?
Kyllä. Jokainen DevOps-bootcamp-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Komento- ja argumentti-injektioiden estäminen
- Salaisten tietojen turvallinen käsittely ja ympäristön siisteys
- Vähimpien oikeuksien suoritus ja sudo-kuri
- Staattinen analyysi ja tarkastus ShellCheckilla