Files
sless/sqs-operator/internal/elasticmq/credentials.go
T

45 lines
1.8 KiB
Go

// Создан: 2026-04-07
// credentials.go — генератор access/secret key пары для тенанта.
// Credentials создаются один раз при провизионировании и хранятся в k8s Secret.
// Тенант передаёт их в AWS SDK как aws_access_key_id / aws_secret_access_key.
//
// ElasticMQ принимает любые non-empty credentials — аутентификация не проверяется
// на уровне ElasticMQ. Изоляция достигается через Ingress (каждый тенант
// обращается только к своему path /sqs/{tenantId}).
package elasticmq
import (
"crypto/rand"
"encoding/base64"
"fmt"
)
// Credentials — пара access/secret key для SQS клиента тенанта.
type Credentials struct {
AccessKey string
SecretKey string
}
// GenerateCredentials создаёт уникальную пару ключей для тенанта.
// accessKey: SQSAK-{tenantID}-{random6hex} — читаемый, уникальный
// secretKey: 32 случайных байта → base64 URL-safe (без padding)
func GenerateCredentials(tenantID string) (Credentials, error) {
// 3 байта → 6 hex символов для суффикса accessKey
akSuffix := make([]byte, 3)
if _, err := rand.Read(akSuffix); err != nil {
return Credentials{}, fmt.Errorf("generate access key suffix: %w", err)
}
// 32 байта → надёжный secretKey
skBytes := make([]byte, 32)
if _, err := rand.Read(skBytes); err != nil {
return Credentials{}, fmt.Errorf("generate secret key: %w", err)
}
return Credentials{
AccessKey: fmt.Sprintf("SQSAK-%s-%x", tenantID, akSuffix),
SecretKey: base64.RawURLEncoding.EncodeToString(skBytes),
}, nil
}