После переезда: сузить периметр доступа — отзыв старого ключа, узкие правила SSH, уборка секретов #3075

Open
opened 2026-08-24 15:34:12 +00:00 by bot-backend · 1 comment
Collaborator

Эпик: #2989. Выделено из #3029 по решению владельца (2026-08-24): на этапе подготовки только добавляем, удаляем после переезда.

Задача существует ровно затем, чтобы вторая половина не потерялась. «Добавили, работает» не создаёт никакого давления доводить до конца — а до тех пор периметр доступа шире целевого, и это состояние выглядит как норма.

Условие старта

Не раньше, чем: переезд подтверждён, стек на Selectel отработал минимум сутки (критерий из #3057), деплой end-to-end Beget → Selectel прошёл хотя бы дважды. До этого момента ничего из списка ниже не трогать — любое удаление здесь это способ остаться без доступа именно тогда, когда он нужен.

Что сузить

Доступ на Selectel

  • Отозвать старый deploy-ключ: убрать строку из ~/.ssh/authorized_keys пользователя деплоя, проверить, что деплой после этого проходит
  • Снять общее правило ufw allow 22/tcp, оставив только allow from <адрес раннера> — точные команды печатает ops/selectel-ci-access.sh в финальном блоке
  • Проверить, что человеческий административный доступ при этом сохранён (иначе сужение = потеря сервера); порядок — сначала убедиться, что альтернативный путь работает, потом резать
  • ops/selectel-audit.sh после сужения: sshd и ufw отражают целевое состояние

Секреты Forgejo Actions

  • Пройти по списку и удалить ставшие ненужными. На 2026-08-24 в workflow используются: DEPLOY_HOST, DEPLOY_PORT, DEPLOY_SSH_KEY, DEPLOY_USER, INFRA_DEPLOY_HOST, INFRA_DEPLOY_PORT, INFRA_DEPLOY_SSH_KEY, INFRA_DEPLOY_USER, GHCR_PAT, GLITCHTIP_BACKEND_DSN, GLITCHTIP_FRONTEND_DSN, OBJECTIVE_API_KEY, OPENAI_API_KEY, FORGEJO_BOT_QA_TOKEN
  • По каждому зафиксировать, покидает ли он теперь машину раннера (после переезда envs: в appleboy/ssh-action уносит GHCR_PAT, OPENAI_API_KEY, OBJECTIVE_API_KEY, GLITCHTIP_BACKEND_DSN по сети на другой хост — раньше это был тот же сервер)
  • Ротировать те, что ходили по сети до включения проверки подлинности хоста

Старая БД на Beget (связано с #3061)

  • После подтверждённой работы forgejo/glitchtip на новом контейнере — переименовать или удалить их копии в gendesign-postgres-1. Пока они там лежат, автодетект в ops/backup-forgejo.sh упирается в двух кандидатов, а протухшая копия остаётся ловушкой «бэкап выглядит здоровым и им не является»

Почему отдельной задачей, а не чек-боксами в #3029

#3029 закроется, когда деплой поедет на новый хост. Пункты выше к этому моменту будут ещё не выполнимы — их условие старта наступает позже. Оставленные внутри закрытой задачи они не всплывут никогда.

Refs #3029, #3057, #3061, #2989

Эпик: #2989. Выделено из #3029 по решению владельца (2026-08-24): **на этапе подготовки только добавляем, удаляем после переезда.** Задача существует ровно затем, чтобы вторая половина не потерялась. «Добавили, работает» не создаёт никакого давления доводить до конца — а до тех пор периметр доступа шире целевого, и это состояние выглядит как норма. ## Условие старта Не раньше, чем: переезд подтверждён, стек на Selectel отработал **минимум сутки** (критерий из #3057), деплой end-to-end Beget → Selectel прошёл хотя бы дважды. До этого момента ничего из списка ниже не трогать — любое удаление здесь это способ остаться без доступа именно тогда, когда он нужен. ## Что сузить ### Доступ на Selectel - [ ] Отозвать старый deploy-ключ: убрать строку из `~/.ssh/authorized_keys` пользователя деплоя, проверить, что деплой после этого проходит - [ ] Снять общее правило ufw `allow 22/tcp`, оставив только `allow from <адрес раннера>` — точные команды печатает `ops/selectel-ci-access.sh` в финальном блоке - [ ] Проверить, что человеческий административный доступ при этом сохранён (иначе сужение = потеря сервера); порядок — сначала убедиться, что альтернативный путь работает, потом резать - [ ] `ops/selectel-audit.sh` после сужения: sshd и ufw отражают целевое состояние ### Секреты Forgejo Actions - [ ] Пройти по списку и удалить ставшие ненужными. На 2026-08-24 в workflow используются: `DEPLOY_HOST`, `DEPLOY_PORT`, `DEPLOY_SSH_KEY`, `DEPLOY_USER`, `INFRA_DEPLOY_HOST`, `INFRA_DEPLOY_PORT`, `INFRA_DEPLOY_SSH_KEY`, `INFRA_DEPLOY_USER`, `GHCR_PAT`, `GLITCHTIP_BACKEND_DSN`, `GLITCHTIP_FRONTEND_DSN`, `OBJECTIVE_API_KEY`, `OPENAI_API_KEY`, `FORGEJO_BOT_QA_TOKEN` - [ ] По каждому зафиксировать, покидает ли он теперь машину раннера (после переезда `envs:` в `appleboy/ssh-action` уносит `GHCR_PAT`, `OPENAI_API_KEY`, `OBJECTIVE_API_KEY`, `GLITCHTIP_BACKEND_DSN` по сети на другой хост — раньше это был тот же сервер) - [ ] Ротировать те, что ходили по сети до включения проверки подлинности хоста ### Старая БД на Beget (связано с #3061) - [ ] После подтверждённой работы `forgejo`/`glitchtip` на новом контейнере — переименовать или удалить их копии в `gendesign-postgres-1`. Пока они там лежат, автодетект в `ops/backup-forgejo.sh` упирается в двух кандидатов, а протухшая копия остаётся ловушкой «бэкап выглядит здоровым и им не является» ## Почему отдельной задачей, а не чек-боксами в #3029 #3029 закроется, когда деплой поедет на новый хост. Пункты выше к этому моменту будут ещё не выполнимы — их условие старта наступает позже. Оставленные внутри закрытой задачи они не всплывут никогда. Refs #3029, #3057, #3061, #2989
bot-backend added the
chore
priority/p2
scope/devops
security
status/blocked
labels 2026-08-24 15:34:12 +00:00
Author
Collaborator

Перепроверка 27.08.2026 (после пересборки базы 25-26.08 и переезда продукта на Poincare). Тело тикета писалось 20-24.08 по старой инфраструктуре.

Посылка держится: 22/tcp ALLOW IN Anywhere, в authorized_keys два ключа — старый деплойный не отозван. Тикет актуален как есть.

**Перепроверка 27.08.2026** (после пересборки базы 25-26.08 и переезда продукта на Poincare). Тело тикета писалось 20-24.08 по старой инфраструктуре. Посылка держится: `22/tcp ALLOW IN Anywhere`, в `authorized_keys` два ключа — старый деплойный не отозван. Тикет актуален как есть.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3075
No description provided.