# NordaBiz - Zarządzanie danymi uwierzytelniającymi

Ten dokument zawiera szczegółowe zasady zarządzania hasłami, kluczami API i innymi wrażliwymi danymi.
Główne instrukcje znajdują się w [CLAUDE.md](../CLAUDE.md).

---

## KRYTYCZNE: Nigdy nie umieszczaj haseł w kodzie!

**NIGDY nie umieszczaj haseł i kluczy API bezpośrednio w kodzie źródłowym!**

Jest to krytyczna podatność bezpieczeństwa (CWE-798: Use of Hard-coded Credentials). Narusza standardy bezpieczeństwa i może prowadzić do kompromitacji systemu jeśli repozytorium zostanie ujawnione.

---

## Zasady obowiązkowe

### 1. Używaj zmiennych środowiskowych

```python
# ✅ PRAWIDŁOWO:
DATABASE_URL = os.getenv('DATABASE_URL')
API_KEY = os.getenv('GOOGLE_PAGESPEED_API_KEY')

# ❌ BŁĘDNIE - NIGDY TAK NIE RÓB:
DATABASE_URL = 'postgresql://user:password123@localhost/db'
API_KEY = 'AIzaSyAbc123...'
```

### 2. Wartości domyślne jako bezpieczne placeholdery

```python
# ✅ PRAWIDŁOWO - wartość domyślna która wymusi konfigurację .env:
DATABASE_URL = os.getenv('DATABASE_URL', 'postgresql://user:CHANGE_ME@localhost/nordabiz')

# ❌ BŁĘDNIE - wartość produkcyjna jako fallback:
DATABASE_URL = os.getenv('DATABASE_URL', 'postgresql://user:RealPassword@10.22.68.249/nordabiz')
```

### 3. Przechowuj credentials w plikach .env

| Środowisko | Lokalizacja |
|------------|-------------|
| Produkcja | `/var/www/nordabiznes/.env` |
| Development | `.env` w katalogu projektu |
| Wzorzec | `.env.example` (bez prawdziwych wartości!) |

---

## Wymagane zmienne środowiskowe

| Zmienna | Cel | Przykład |
|---------|-----|----------|
| `DATABASE_URL` | Połączenie PostgreSQL dla skryptów Python | `postgresql://user:pass@127.0.0.1:5432/nordabiz` |
| `PGPASSWORD` | Hasło PostgreSQL dla skryptów shell | `export PGPASSWORD='your_password'` |
| `GOOGLE_PAGESPEED_API_KEY` | API Key Google PageSpeed | `AIzaSy...` |
| `BRAVE_SEARCH_API_KEY` | API Key Brave Search | `BSA...` |
| `GEMINI_API_KEY` | API Key Google Gemini AI | `AIzaSy...` |

---

## Skrypty shell - sprawdzanie zmiennych

```bash
# ✅ PRAWIDŁOWO:
if [ -z "$PGPASSWORD" ]; then
  echo "ERROR: PGPASSWORD not set"
  exit 1
fi
psql -h localhost -U nordabiz_app -d nordabiz

# ❌ BŁĘDNIE:
PGPASSWORD='hardcoded_password' psql -h localhost -U nordabiz_app -d nordabiz
```

---

## NIGDY nie commituj plików z credentials

- `.env` jest w `.gitignore`
- Sprawdzaj przed commitem: `git diff` i `git status`
- W razie wątpliwości: `git log -p | grep -i password`

---

## Co zrobić jeśli przypadkowo scommitujesz hasło

⚠️ **NATYCHMIAST zmień hasło w bazie/API**

Powód: Nie wystarczy usunąć z najnowszego commita - hasło pozostaje w historii Git.

### Opcje naprawy:

1. **Zmiana hasła** (ZALECANE)
   - Natychmiast zmień hasło we wszystkich systemach
   - Traktuj stare hasło jako skompromitowane
   - Najprostsze i najbezpieczniejsze rozwiązanie

2. **Przepisanie historii Git** (SKOMPLIKOWANE)
   - `git filter-branch` lub `BFG Repo-Cleaner`
   - Wymaga force push do wszystkich remotów
   - Może powodować problemy dla innych deweloperów

---

## Wyjątki - kiedy dozwolone jest hasło w kodzie

| Dozwolone | Niedozwolone |
|-----------|--------------|
| ✅ Pliki dokumentacji (CLAUDE.md, README) | ⛔ Pliki Python (.py) |
| ✅ `.env.example` z placeholderami | ⛔ Skrypty shell (.sh) |
| | ⛔ Pliki JavaScript (.js) |

---

## Weryfikacja przed wdrożeniem

```bash
# Sprawdź czy nie ma hardcoded credentials w kodzie:
grep -r "PGPASSWORD=" --include="*.sh" .
grep -r "postgresql://.*:.*@" --include="*.py" . | grep -v "CHANGE_ME" | grep -v ".example" | grep -v "PASSWORD"

# Oczekiwany wynik: brak znalezisk (lub tylko w dokumentacji/placeholderach)
```

---

## Bezpieczne przechowywanie

### Lokalizacje plików .env

```
/var/www/nordabiznes/.env        # Produkcja (PROD)
./nordabiz/.env                  # Development (DEV)
```

### Uprawnienia plików

```bash
# Tylko właściciel może czytać plik .env
chmod 600 /var/www/nordabiznes/.env
chown www-data:www-data /var/www/nordabiznes/.env
```

---

## Konfiguracja IDE

### VS Code - wykluczenie .env z wyszukiwania

```json
// .vscode/settings.json
{
  "search.exclude": {
    "**/.env": true
  }
}
```

### Git - ignorowanie .env

```gitignore
# .gitignore
.env
.env.local
.env.*.local
*.env
```
