4.7 KiB
4.7 KiB
Fix: 401 "key is of invalid type" при invoke функций
Статус: ГОТОВО К ПРАВКЕ (не исправлено)
Root Cause (установлен 2026-05-18)
Secret router в k8s namespace fission был ротирован.
Router pod перезапустился — подхватил новый пароль.
Console pod НЕ перезапускался (5d8h) — имеет старый пароль в env var.
FISSION_AUTH_PASSWORD в console pod (env) |
ToAjBTs0Sb8mLC1J9NN3 (СТАРЫЙ) |
password в k8s secret router (текущий) |
slxGj3G3FAD7l5ms2tJ9 |
Цепочка отказа
getRouterToken()→POST /auth/loginсо старым паролем → 401 Unauthorized- Fallback:
return s.readSAToken()→ Kubernetes SA token,alg: RS256 - Console отправляет
Authorization: Bearer <RS256-SA-token>в router - Router keyfunc:
return []byte(JWT_SIGNING_KEY), nil— возвращает[]byteдля любого алгоритма jwt.Parseполучает RS256 JWT но ключ[]byte(ожидается*rsa.PublicKey) → "key is of invalid type"
Подтверждено
# Старый пароль → 401:
kubectl exec -n fission fission-console-874c786c6-j6fvd -- wget -qO- \
--post-data='{"username":"admin","password":"ToAjBTs0Sb8mLC1J9NN3"}' \
--header='Content-Type: application/json' \
http://router.fission.svc.cluster.local/auth/login
# → HTTP/1.1 401 Unauthorized
# Новый пароль → OK:
# password=slxGj3G3FAD7l5ms2tJ9 → {"accesstoken":"eyJhbGciOiJIUzI1NiI..."}
Что нужно исправить
Файл 1: console/internal/api/server.go — функция getRouterToken()
Проблема A: читает пароль из env var один раз при старте → устаревает при ротации secret.
Проблема B: при ошибке login молча возвращает SA token вместо ошибки.
Нужно:
- Читать username/password из файла при каждом вызове
getRouterToken(), а не изos.Getenvпри старте. Путь файла:/etc/fission-router-secret/usernameи/etc/fission-router-secret/password - При ошибке login — возвращать
("", error), неreadSAToken(). Caller (handleInvokeFunction) должен вернуть 503 с понятным сообщением.
Файл 2: console/deploy/console.yaml
Нужно: заменить env → secretKeyRef на volume mount.
# Убрать из env:
- name: FISSION_AUTH_USERNAME
valueFrom:
secretKeyRef:
name: router
key: username
- name: FISSION_AUTH_PASSWORD
valueFrom:
secretKeyRef:
name: router
key: password
# Добавить volume:
volumes:
- name: router-secret
secret:
secretName: router
items:
- key: username
path: username
- key: password
path: password
# Добавить volumeMount:
volumeMounts:
- name: router-secret
mountPath: /etc/fission-router-secret
readOnly: true
Kubernetes обновляет смонтированные secret-файлы автоматически в течение ~60с после изменения secret.
Порядок работы
- Прочитать текущий код
getRouterToken()вconsole/internal/api/server.go - Найти где инициализируются
s.authUser/s.authPass(вероятно вNewServer()или аналоге) - Убрать сохранение в struct, читать из файла на каждый вызов
getRouterToken() - Изменить возврат при ошибке login:
return "", fmt.Errorf("router login failed: %w", err)вместоreadSAToken() - Найти всех callers
getRouterToken()— обработать ошибку (вернуть 503) - Обновить
console/deploy/console.yaml(volume mount вместо env) - Увеличить тег образа (согласно правилам: vX.Y.Z → vX.Y.Z+1)
- rsync → build → push → apply
Текущий тег образа
Проверить: grep "naeel/fission-console" console/deploy/console.yaml
Последний известный: v1.3.92
SSH / rsync
# rsync:
rsync -az -e "ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10" \
~/fission-console/ naeel@5.172.178.213:~/terra/fission/
# SSH:
ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 'КОМАНДА'