Безопасность самообновляющегося веб-приложения
Каковы проблемы безопасности следующего сценария? (это одна из тех безумных идей, которые кто-то попробует, и, может быть, это хорошая идея, а может, и ужасная идея...)
У вас есть приложение Rails на example.com, а действие - на https://example.com/admin/update_app
Это действие имеет следующие требования:
- Требует https (и перенаправляет, если не на https)
- Требуется доступ администратора
- Действие отображает страницу с формой с надписью "Пароль хранилища: [ ]"
- Это поле отфильтровывается из журналов сервера, так же, как отфильтровывается аутентификация на сайте с помощью механизма фильтрации журналов в Rails (т. Е. Этот метод).
Это действие делает следующее
- Вы вводите свой пароль к хранилищу кода в поле и нажимаете "Отправить".
- Действие запускает сценарий оболочки, который извлекает последние обновления из стабильной ветви вашего репозитория кода и применяет их к сайту (если только аутентификация репозитория не завершится неудачей, в этом случае он останавливает все дальнейшие шаги)
- Веб-сервер перезапущен
- Администратору отправлено электронное письмо со словами: "Обновление приложения завершено".
2 ответа
Не отправляйте пароль. Приложение может быть скомпрометировано и запущено, либо фильтрация может завершиться ошибкой. Вместо этого предоставьте веб-приложению доступ только для чтения к хранилищу через отдельную учетную запись или публичный доступ.
Не перезагружайте сервер, если нет изменений. Тогда действие является безопасным даже без контроля доступа: если разработчик не разрешил обновление путем обновления стабильной ветви, ничего не произойдет. Если стабильная ветвь не так стабильна, создайте для этого отдельную производственную ветвь.
Остановите веб-сервер перед обновлением. Приложение может быть небезопасным или небезопасным для использования в качестве набора файлов из разных версий.
Убедитесь, что веб-сервер не обслуживает файлы метаданных, оставленные VCS.
Что ж, все это напоминает мне переизобретенное развертывание capistrano на сервере через репозиторий git.
Единственная проблема в том, что: 1) что будет, если во время слияния возникнут конфликты (пункт 2)? 2) что если веб-сервер не будет корректно перезагружен (пункт 3)? 3) Что если ветка в вашем хранилище не так стабильна (пункт 2)?