// Изменён: 2026-04-07 // elasticmq_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 }