mirror of
https://gitverse.ru/kpa39l/openspec-lab.git
synced 2026-09-29 09:15:01 +00:00
Archive grafana-readonly-user: read-only пользователь Grafana (it@vinogorod.ru, Viewer); OSS 11.1 provisioning users не работает — только UI
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-08
|
||||
@@ -0,0 +1,49 @@
|
||||
# Design: Grafana read-only user — ручное создание (OSS-совместимо)
|
||||
|
||||
## Файлы
|
||||
|
||||
| Файл | Действие | Назначение |
|
||||
|---|---|---|
|
||||
| `/opt/monitoring/grafana-data/grafana.db` | изменяется Grafana при создании пользователя | хранит учётку (UI, не вручную) |
|
||||
| `/opt/monitoring/README.md` | обновить | документация пользователя и роли |
|
||||
| `/opt/monitoring/EXPERIENCE.md` | обновить | вывод: OSS 11.1 не умеет provisioning users |
|
||||
|
||||
Никакие конфиги/провиджеры НЕ меняются.
|
||||
|
||||
## Почему не provisioning
|
||||
|
||||
- `grafana/provisioning/access-control/users.yml` — файловое provisioning
|
||||
пользователей в Grafana 11 OSS **не обрабатывается** (в логах только
|
||||
dashboards/datasources/alerting/plugins; access-control — EE-фича).
|
||||
- API: `POST /api/users` → 404 (OSS), `POST /api/login` → 401 при верном
|
||||
пароле (Basic auth работает, JSON-логин нет). Доступно только создание
|
||||
пользователя в **UI**.
|
||||
|
||||
## Создание в UI
|
||||
|
||||
1. Открыть `http://grafana.nixg.ru` (или `http://127.0.0.1:3001`), войти
|
||||
как `estorozhenko` (admin).
|
||||
2. Administration → Users → **New user**:
|
||||
- Email: `it@vinogorod.ru`
|
||||
- Name: `IT Vinogorod`
|
||||
- Role: `Viewer`
|
||||
- Password: `1qazXSW2` (задать вручную, не отсылать invite)
|
||||
3. Сохранить.
|
||||
|
||||
## Проверка (после создания)
|
||||
|
||||
```bash
|
||||
# 1. логин рабочий
|
||||
curl -s -u 'it@vinogorod.ru:1qazXSW2' http://127.0.0.1:3001/api/user
|
||||
# 2. роль Viewer в орге
|
||||
curl -s -u 'estorozhenko:...' http://127.0.0.1:3001/api/orgs/1/users
|
||||
# 3. read-only: админ-ручка недоступна
|
||||
curl -s -u 'it@vinogorod.ru:1qazXSW2' http://127.0.0.1:3001/api/users # → 403
|
||||
```
|
||||
|
||||
## Риски
|
||||
|
||||
- Слабый пароль `1qazXSW2` (клавиатурная последовательность) на публичной
|
||||
Grafana. Рекомендовать смену или ограничение доступа по IP (caddy/VPN).
|
||||
- Пользователь создаётся вручную — при перезаписи grafana-data потребуется
|
||||
пересоздать. Продублировать в README.
|
||||
@@ -0,0 +1,39 @@
|
||||
# Proposal: Add read-only Grafana user for Vinogorod IT
|
||||
|
||||
## Зачем
|
||||
|
||||
К дашбордам мониторинга (Grafana, `grafana.nixg.ru`) нужен read-only доступ
|
||||
сотруднику IT Винограда; полный доступ (admin) ему не положен.
|
||||
|
||||
- **Затронутые сервисы/порты:** Grafana (`/opt/monitoring`, docker compose,
|
||||
порт 3001, публично `grafana.nixg.ru`).
|
||||
- **Пользователь:** `it@vinogorod.ru`, пароль `1qazXSW2`, роль **Viewer**.
|
||||
|
||||
## Что
|
||||
|
||||
Grafana **OSS 11.1 не поддерживает файловое provisioning пользователей**
|
||||
(access-control работает только для dashboards/datasources/alerting; модуль
|
||||
`security.provisioning` — EE/Cloud). Поэтому пользователь создаётся **вручную
|
||||
в UI** (`/etc/grafana/provisioning` НЕ трогаем).
|
||||
|
||||
Шаги:
|
||||
1. Войти в Grafana как admin (`http:// grafana.nixg.ru`, логин estorozhenko).
|
||||
2. Administration → Users → Invite/New user:
|
||||
- Email: `it@vinogorod.ru`
|
||||
- Name: `IT Vinogorod`
|
||||
- Role: **Viewer** (read-only)
|
||||
- Password: `1qazXSW2` (задать вручную при создании)
|
||||
3. Убедиться, что роль Viewer (не Admin, не Editor).
|
||||
|
||||
## Rollback
|
||||
|
||||
1. Grafana → Administration → Users → `it@vinogorod.ru` → Delete.
|
||||
2. Никаких файлов конфигов не менялось — откат не требуется.
|
||||
3. Пароль при необходимости сменить (Administration → Users → Edit).
|
||||
|
||||
## Примечание
|
||||
|
||||
- Пароль `1qazXSW2` слабый (клавиатурный); Grafana публична. Рекомендация:
|
||||
сменить на более стойкий или ограничить доступ по IP (caddy/VPN).
|
||||
- Файловый provisioning пользователей в этом стеке невозможен (OSS) — при
|
||||
пересоздании контейнера пользователь **не исчезнет** (хранится в grafana-data).
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
# Delta for grafana access control
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Read-only Grafana user for Vinogorod IT
|
||||
|
||||
Grafana MUST provide a read-only account for the Vinogorod IT department:
|
||||
login `it@vinogorod.ru`, role `Viewer`, in the default organization (orgId 1).
|
||||
The account MUST NOT be able to create, edit, or delete dashboards,
|
||||
datasources, or settings.
|
||||
|
||||
#### Scenario: User exists with Viewer role
|
||||
- GIVEN the admin has created the user `it@vinogorod.ru` in the Grafana UI
|
||||
- WHEN the user logs in with the shared password
|
||||
- THEN authentication succeeds (Basic auth `/api/user` → HTTP 200)
|
||||
- AND the organization role is `Viewer` (`/api/orgs/1/users` → role "Viewer")
|
||||
|
||||
#### Scenario: Unknown credentials rejected
|
||||
- GIVEN the read-only user `it@vinogorod.ru`
|
||||
- WHEN a request is made with a wrong password
|
||||
- THEN the API returns HTTP 401
|
||||
|
||||
#### Scenario: Read-only enforced
|
||||
- GIVEN the user `it@vinogorod.ru` is logged in as `Viewer`
|
||||
- WHEN the user attempts a privileged operation (e.g. `POST /api/users`,
|
||||
modify datasources)
|
||||
- THEN the request is rejected (HTTP 403/404)
|
||||
|
||||
### Requirement: No admin rights for IT user
|
||||
|
||||
The IT read-only account MUST NOT have admin or editor rights; only viewing
|
||||
of dashboards and logs is permitted.
|
||||
|
||||
#### Scenario: Role is not elevated
|
||||
- GIVEN the user `it@vinogorod.ru`
|
||||
- WHEN checking its org role and admin flag (`/api/user` + `/api/orgs/1/users`)
|
||||
- THEN role is `Viewer` and `isGrafanaAdmin` is false
|
||||
@@ -0,0 +1,19 @@
|
||||
# Tasks
|
||||
|
||||
## 1. Создание пользователя в UI Grafana (вручную, пользователь)
|
||||
- [x] 1.1 Админ-доступ подтверждён: Basic auth `estorozhenko` работает (200 на /api/user; GET /api/users показывает admin id=1)
|
||||
- [x] 1.2 Проверка невозможности API-создания: `POST /api/users` → 404 (OSS 11.1 не даёт create через API)
|
||||
- [x] 1.3 Создать `it@vinogorod.ru` в UI Grafana (Administration → Users → New user): роль **Viewer**, пароль `1qazXSW2`
|
||||
(выполнено пользователем в UI; id=2 в /api/users, вход подтверждён пользователем)
|
||||
|
||||
## 2. Проверка созданного пользователя
|
||||
- [x] 2.1 `curl -s -u it@vinogorod.ru:1qazXSW2 http://127.0.0.1:3001/api/user` → 200, login=it@vinogorod.ru
|
||||
- [x] 2.2 Роль: в `/api/orgs/1/users` (admin) → `it@vinogorod.ru` role=`Viewer`, disabled=false
|
||||
- [x] 2.3 Негатив: неверный пароль → 401
|
||||
- [x] 2.4 Read-only: API `/api/users` с токеном it@vinogorod.ru → 403 (additional permissions)
|
||||
|
||||
## 3. Документация и git
|
||||
- [x] 3.1 Обновить `/opt/monitoring/README.md` (пользователь it@vinogorod.ru, Viewer, пароль у пользователя)
|
||||
- [x] 3.2 Запись в `/opt/monitoring/EXPERIENCE.md` (OSS 11.1: provisioning users не работает; API create → 404; только UI)
|
||||
- [x] 3.3 `git add` (поимённо) + commit + push в gitverse (истина) — da1746c в master
|
||||
- [ ] 3.4 `openspec validate grafana-readonly-user` + `openspec archive --yes` + STATUS/WALKTHROUGH
|
||||
@@ -0,0 +1,40 @@
|
||||
# grafana-access-control Specification
|
||||
|
||||
## Purpose
|
||||
TBD - created by archiving change grafana-readonly-user. Update Purpose after archive.
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: Read-only Grafana user for Vinogorod IT
|
||||
|
||||
Grafana MUST provide a read-only account for the Vinogorod IT department:
|
||||
login `it@vinogorod.ru`, role `Viewer`, in the default organization (orgId 1).
|
||||
The account MUST NOT be able to create, edit, or delete dashboards,
|
||||
datasources, or settings.
|
||||
|
||||
#### Scenario: User exists with Viewer role
|
||||
- GIVEN the admin has created the user `it@vinogorod.ru` in the Grafana UI
|
||||
- WHEN the user logs in with the shared password
|
||||
- THEN authentication succeeds (Basic auth `/api/user` → HTTP 200)
|
||||
- AND the organization role is `Viewer` (`/api/orgs/1/users` → role "Viewer")
|
||||
|
||||
#### Scenario: Unknown credentials rejected
|
||||
- GIVEN the read-only user `it@vinogorod.ru`
|
||||
- WHEN a request is made with a wrong password
|
||||
- THEN the API returns HTTP 401
|
||||
|
||||
#### Scenario: Read-only enforced
|
||||
- GIVEN the user `it@vinogorod.ru` is logged in as `Viewer`
|
||||
- WHEN the user attempts a privileged operation (e.g. `POST /api/users`,
|
||||
modify datasources)
|
||||
- THEN the request is rejected (HTTP 403/404)
|
||||
|
||||
### Requirement: No admin rights for IT user
|
||||
|
||||
The IT read-only account MUST NOT have admin or editor rights; only viewing
|
||||
of dashboards and logs is permitted.
|
||||
|
||||
#### Scenario: Role is not elevated
|
||||
- GIVEN the user `it@vinogorod.ru`
|
||||
- WHEN checking its org role and admin flag (`/api/user` + `/api/orgs/1/users`)
|
||||
- THEN role is `Viewer` and `isGrafanaAdmin` is false
|
||||
Reference in New Issue
Block a user