[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-bezopasnost-konteynerov-zachem-i-kak-ispolzovat-read-only-faylovuyu-sistemu-v-konteynerakh":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":21,"progress":22,"seo":23},315,"zachem-i-kak-ispolzovat-read-only-faylovuyu-sistemu-v-konteynerakh",9,"bezopasnost-konteynerov","Безопасность контейнеров","🛡️","Зачем и как использовать read-only файловую систему в контейнерах?","Read-only файловая система контейнера -- это режим, при котором корневая файловая система монтируется только для чтения, запрещая любую запись в неё во время выполнения. Это защищает от внедрения вредоносного кода, модификации конфигурации, записи бэкдоров и изменения бинарных файлов приложения.\n\nАналогия: read-only ФС -- как стеклянная витрина в музее. Экспонаты (файлы приложения) можно смотреть, но нельзя трогать. Если атакующий проникнет в контейнер, он не сможет ничего изменить или подложить.\n\n### В Docker\n\n```bash\n# Запуск с read-only ФС\ndocker run --read-only \\\n    --tmpfs \u002Ftmp:rw,noexec,nosuid,size=100m \\\n    --tmpfs \u002Fvar\u002Fcache:rw,noexec,nosuid \\\n    my-java-app\n```\n\nФлаги tmpfs:\n\n| Флаг | Назначение |\n|------|-----------|\n| `rw` | Разрешить запись (только в tmpfs) |\n| `noexec` | Запретить выполнение файлов из этой директории |\n| `nosuid` | Игнорировать setuid-бит |\n| `size=100m` | Ограничение размера |\n\n### В Kubernetes\n\n\u003Cdetails>\n\u003Csummary>Полный манифест с read-only ФС и необходимыми volume\u003C\u002Fsummary>\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: banking-service\nspec:\n  containers:\n  - name: app\n    image: registry.bank.local\u002Fbanking-service:1.0.0\n    securityContext:\n      readOnlyRootFilesystem: true\n    volumeMounts:\n    # Java нуждается в \u002Ftmp для временных файлов\n    - name: tmp-volume\n      mountPath: \u002Ftmp\n    # Логи приложения\n    - name: logs-volume\n      mountPath: \u002Fapp\u002Flogs\n    # Spring Boot может создавать temporary файлы\n    - name: spring-tmp\n      mountPath: \u002Fapp\u002FBOOT-INF\u002Ftmp\n  volumes:\n  - name: tmp-volume\n    emptyDir:\n      medium: Memory    # Хранить в RAM (как tmpfs)\n      sizeLimit: 100Mi\n  - name: logs-volume\n    emptyDir:\n      sizeLimit: 500Mi\n  - name: spring-tmp\n    emptyDir:\n      medium: Memory\n      sizeLimit: 50Mi\n```\n\n\u003C\u002Fdetails>\n\n### Типичные директории, требующие записи для Java-приложений\n\n| Директория | Зачем нужна | Рекомендация |\n|------------|-------------|--------------|\n| `\u002Ftmp` | Временные файлы JVM, Tomcat | `emptyDir` с `medium: Memory` |\n| `\u002Fapp\u002Flogs` | Логи приложения | `emptyDir` или PVC |\n| `\u002Fvar\u002Fcache` | Кэш HTTP-клиентов | `emptyDir` |\n| `\u002Fhome\u002Fappuser\u002F.java` | Preferences API | `emptyDir` |\n\n### Dockerfile с учётом read-only ФС\n\n```dockerfile\nFROM eclipse-temurin:21-jre-alpine\n\nRUN addgroup -S app && adduser -S app -G app && \\\n    mkdir -p \u002Fapp \u002Ftmp && \\\n    chown -R app:app \u002Fapp \u002Ftmp\n\nWORKDIR \u002Fapp\nCOPY --chown=app:app target\u002Fservice.jar \u002Fapp\u002Fapp.jar\n\nUSER app\n\n# Указать Java использовать \u002Ftmp для временных файлов\nENTRYPOINT [\"java\", \"-Djava.io.tmpdir=\u002Ftmp\", \"-jar\", \"\u002Fapp\u002Fapp.jar\"]\n```\n\n### Вывод\n\nRead-only файловая система -- простая, но мощная мера защиты. Она гарантирует иммутабельность контейнера: то, что было собрано на этапе build, нельзя изменить в runtime. Для Java-приложений необходимо явно монтировать writable-директории (`\u002Ftmp`, `\u002Fapp\u002Flogs`) через `emptyDir` или `tmpfs`.\n\n> **На собеседовании:** упомяните `readOnlyRootFilesystem: true` и объясните, что Java-приложению нужен writable `\u002Ftmp` (для JVM и Tomcat). Покажите знание флагов `noexec` и `nosuid` для tmpfs -- это демонстрирует глубокое понимание.","","middle",[15,16,17,18,19,20],"kubernetes","tmpfs","emptyDir","container-security","read-only","docker",[],null,{"title":24,"description":25,"ogTitle":26,"ogDescription":27,"keywords":28,"schemaAnswer":34,"featuredSnippetReady":35},"Read-only файловая система в контейнерах — Docker и Kubernetes — Gymterview","Read-only FS предотвращает внедрение вредоносного кода и модификацию файлов. Настройка --read-only в Docker, readOnlyRootFilesystem в Kubernetes. Типичные tmpfs.","Read-only файловая система в Docker и Kubernetes","--read-only в Docker и readOnlyRootFilesystem в Kubernetes. Монтирование tmpfs\u002FemptyDir для \u002Ftmp, \u002Fapp\u002Flogs. Флаги noexec и nosuid для защиты.",[29,30,31,32,33],"read-only файловая система контейнер","readOnlyRootFilesystem Kubernetes","Docker read-only","tmpfs контейнер","emptyDir Kubernetes","Read-only FS защищает от внедрения вредоносного кода, модификации конфигурации и записи бэкдоров. В Docker: --read-only с --tmpfs для \u002Ftmp. В Kubernetes: readOnlyRootFilesystem: true с emptyDir для записи. Для Java нужны writable: \u002Ftmp (временные файлы JVM), \u002Fapp\u002Flogs (логи), \u002Fvar\u002Fcache. Рекомендуется emptyDir с medium: Memory.",true]