[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-setevaya-bezopasnost-kak-bezopasno-khranit-sekrety-v-prilozhenii":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},1202,"kak-bezopasno-khranit-sekrety-v-prilozhenii",24,"setevaya-bezopasnost","Сетевая безопасность","🔒","Как безопасно хранить секреты в приложении?","Секреты (пароли, ключи API, сертификаты, токены) — одна из самых уязвимых частей любого приложения. Правильное хранение секретов — это использование специализированных хранилищ с контролем доступа и аудитом, а не размещение их в коде или конфигурационных файлах.\n\n### Что НЕЛЬЗЯ делать\n\n```java\n\u002F\u002F КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО: секреты в коде\npublic class DatabaseConfig {\n    private static final String DB_PASSWORD = \"SuperSecret123!\"; \u002F\u002F Попадёт в Git\n}\n```\n\n```yaml\n# НЕПРАВИЛЬНО: секреты в application.yml в репозитории\nspring:\n  datasource:\n    password: SuperSecret123!\n```\n\n### Уровни хранения секретов (от простого к сложному)\n\n### 1. Переменные окружения\n\nПростейший способ, подходит для начального уровня:\n\n```yaml\n# application.yml\nspring:\n  datasource:\n    password: ${DB_PASSWORD}\n```\n\n```bash\nexport DB_PASSWORD=SuperSecret123!\njava -jar app.jar\n```\n\nМинусы: переменные видны через `\u002Fproc\u002F\u003Cpid>\u002Fenviron`, в docker inspect, в логах систем оркестрации.\n\n### 2. Kubernetes Secrets\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: db-credentials\n  namespace: payment\ntype: Opaque\ndata:\n  password: U3VwZXJTZWNyZXQxMjMh  # base64-encoded (НЕ шифрование!)\n```\n\n```yaml\n# Использование в Pod\nspec:\n  containers:\n    - name: payment-service\n      env:\n        - name: DB_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: db-credentials\n              key: password\n```\n\nKubernetes Secrets по умолчанию хранятся в etcd в base64 (не зашифровано). Необходимо включить шифрование etcd at rest.\n\n### 3. HashiCorp Vault\n\nVault — специализированное решение для управления секретами.\n\n```bash\n# Запись секрета\nvault kv put secret\u002Fpayment-service db_password=SuperSecret123!\n\n# Чтение секрета\nvault kv get secret\u002Fpayment-service\n```\n\n\u003Cdetails>\u003Csummary>Интеграция с Spring Boot через Spring Cloud Vault\u003C\u002Fsummary>\n\n```yaml\n# bootstrap.yml\nspring:\n  cloud:\n    vault:\n      uri: https:\u002F\u002Fvault.mybank.local:8200\n      authentication: KUBERNETES\n      kubernetes:\n        role: payment-service\n      kv:\n        backend: secret\n        default-context: payment-service\n```\n\n```java\n\u002F\u002F Секреты автоматически подставляются в Spring-конфигурацию\n@Value(\"${db_password}\")\nprivate String dbPassword;\n```\n\n\u003C\u002Fdetails>\n\n### Возможности Vault\n\n- Динамические секреты — Vault генерирует временные учётные данные к БД, которые автоматически отзываются\n- Ротация секретов — автоматическая смена паролей по расписанию\n- Аудит — полный лог доступа к секретам\n- Шифрование как сервис (Transit engine) — Vault шифрует\u002Fрасшифровывает данные без раскрытия ключа приложению\n\n\u003Cdetails>\u003Csummary>Пример динамических секретов для PostgreSQL\u003C\u002Fsummary>\n\n```bash\nvault write database\u002Fconfig\u002Fmydb \\\n    plugin_name=postgresql-database-plugin \\\n    connection_url=\"postgresql:\u002F\u002F{{username}}:{{password}}@db:5432\u002Fmydb\" \\\n    allowed_roles=\"payment-role\" \\\n    username=\"vault\" \\\n    password=\"vaultpass\"\n\nvault write database\u002Froles\u002Fpayment-role \\\n    db_name=mydb \\\n    creation_statements=\"CREATE ROLE \\\"{{name}}\\\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO \\\"{{name}}\\\";\" \\\n    default_ttl=\"1h\" \\\n    max_ttl=\"24h\"\n\n# Получение временных учётных данных\nvault read database\u002Fcreds\u002Fpayment-role\n```\n\n\u003C\u002Fdetails>\n\n### Рекомендации\n\n| Среда | Рекомендуемое хранилище |\n|-------|----------------------|\n| Production | HashiCorp Vault, CyberArk, AWS Secrets Manager |\n| Staging\u002FDev | Kubernetes Secrets с шифрованием etcd |\n| Никогда | Секреты в Git (даже в приватных репозиториях) |\n\nРотация — регулярная смена всех секретов (минимум раз в квартал). Аудит — логирование всех операций с секретами.\n\n> **На собеседовании:** интервьюер хочет услышать про эволюцию от переменных окружения до Vault и понимание того, что K8s Secrets — это base64, а не шифрование. Частая ошибка — не знать про Vault и динамические секреты.","","middle",[15],"network-security",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как безопасно хранить секреты в приложении? — Gymterview","Секреты (пароли, ключи API, сертификаты, токены) — одна из самых уязвимых частей любого приложения. Правильное хранение секретов — это использование специализир","Секреты (пароли, ключи API, сертификаты, токены) — одна из самых уязвимых частей любого приложения. Правильное хранение ",[15,13],"Секреты (пароли, ключи API, сертификаты, токены) — одна из самых уязвимых частей любого приложения. Правильное хранение секретов — это использование специализированных хранилищ с контролем доступа и аудитом, а не размещение их в коде или конфигурационных файлах.",true]