Secure secrets store for OpenClaw agents. AES-256-GCM encryption. Store, retrieve, rotate, and audit secrets. Inject secrets into commands. Zero external dep...
---
name: secrets-manager
description: Secure secrets store for OpenClaw agents. AES-256-GCM encryption. Store, retrieve, rotate, and audit secrets. Inject secrets into commands. Zero external dependencies.
---
# Secrets Manager ๐
**Stop hardcoding secrets. Start managing them securely.**
## The Problem
API keys, tokens, passwords โ they end up in shell history, logs, or committed to git. No local secrets store means every agent session is a potential leak.
Secrets Manager fixes this with AES-256-GCM encrypted local storage and zero dependencies.
## โ ๏ธ Security Warning
Secrets Manager is a **local agent tool**, not a production secrets vault. Raw secrets printed via `--get --raw` or embedded via `--inject` can leak to shell history, terminal scrollback, logs, CI output, and process listings. Prefer environment-variable injection for sensitive contexts. See the Security Notes section below.
## Quick Start
### Store a secret
```bash
node skills/secrets-manager/secrets-manager.js --store openai-key sk-abc123
```
### Get a secret (masked, to stderr)
```bash
node skills/secrets-manager/secrets-manager.js --get openai-key
# Output (stderr): [secrets-manager] openai-key: sk-a****23
```
### Get raw value (โ ๏ธ to stdout โ avoid when possible)
```bash
node skills/secrets-manager/secrets-manager.js --get --raw openai-key
# โ ๏ธ WARNING: Outputs raw secret to stdout
```
### List all secrets
```bash
node skills/secrets-manager/secrets-manager.js --list
```
### Delete a secret
```bash
node skills/secrets-manager/secrets-manager.js --delete old-key
```
### Rotate a secret
```bash
node skills/secrets-manager/secrets-manager.js --rotate openai-key
# Generates a new random value, archives old as "retired"
# New value is never printed โ secure by default
```
### Rotate all secrets
```bash
node skills/secrets-manager/secrets-manager.js --rotate --all
```
### Audit for security issues
```bash
node skills/secrets-manager/secrets-manager.js --audit
node skills/secrets-manager/secrets-manager.js --audit --expired
node skills/secrets-manager/secrets-manager.js --audit --stale
```
### Inject secrets into a command (โ ๏ธ)
```bash
node skills/secrets-manager/secrets-manager.js --inject "curl -H 'Authorization: Bearer {{openai-key}}' https://api.openai.com/v1/chat"
# โ ๏ธ WARNING: Output contains plaintext secrets. Piping to a shell
# exposes them to history, process listings, and logs.
# Prefer: export TOKEN=$(... --get --raw); curl -H "Authorization: Bearer $TOKEN" ...
```
### Status overview
```bash
node skills/secrets-manager/secrets-manager.js --status
```
## Features
### AES-256-GCM Encryption
- 256-bit master key (auto-generated or set via `SECRETS_MASTER_KEY` env var)
- Per-secret random 96-bit IVs
- GCM authenticated encryption detects tampering
- Master key stored in `memory/secrets/.master-key` (mode 0600)
- Secrets stored in `memory/secrets/secrets.json` (mode 0600)
### Rotation Tracking
- 90-day default rotation cycle per secret
- Automatic expiration warnings in audit
- One-command rotation generates new random values
- Old values archived as "retired" for recovery
- New rotated values are never printed
### Audit System
- Detects expired secrets past rotation date
- Flags secrets approaching rotation deadline
- Identifies weak patterns (common prefixes, short length)
- Reports rotation age for each secret
### Command Injection (use with care)
- `{{secret_name}}` placeholders replaced with stored values
- Confirmation printed to stderr, injected command to stdout
- โ ๏ธ Result contains plaintext secrets โ do not pipe to shell casually
- Prefer environment-variable injection for production use
## Configuration
- Secrets stored in: `memory/secrets/secrets.json`
- Master key: `memory/secrets/.master-key` or `SECRETS_MASTER_KEY` env var
- Override storage location: `--dir /path/to/secrets`
## Agent Protocol
When handling secrets:
1. **Never hardcode** โ always use `--store` first
2. **Masked output** โ use `--get` (not `--get --raw`) for display
3. **Audit regularly** โ run `--audit` during health checks
4. **Rotate proactively** โ rotate secrets flagged as expiring
5. **Inject carefully** โ prefer env-var injection over `--inject`
## Security Notes
- Encryption: AES-256-GCM with 256-bit master key and per-secret random IVs
- Authenticated encryption detects tampering or corruption
- Master key stored separately from ciphertext (not in same file)
- All files set to mode `0600` (owner read/write only)
- **โ ๏ธ Raw retrieval (`--get --raw`) prints secrets to stdout** โ exposes to logs, scrollback, CI
- **โ ๏ธ Command injection (`--inject`) embeds plaintext secrets** โ exposes to shell history, `ps`, `/proc`
- For production-grade secret management, use a dedicated vault (HashiCorp Vault, AWS Secrets Manager)
- Secrets directory should be gitignored
- Back up the master key securely โ if lost, all secrets become unrecoverable
## Comparison
| Approach | Encryption | Audit | Rotation | Warnings |
|----------|-----------|-------|----------|----------|
| Environment vars | None | None | Manual | None |
| .env files | None | None | Manual | None |
| **Secrets Manager** | **AES-256-GCM** | **Auto** | **Auto** | **Built-in** |
| Vault service | AES-256-GCM | Auto | Auto | Enterprise |
**Secrets Manager gives you authenticated encryption + rotation + auditing with zero external dependencies.**
## Design Principles
1. **Real encryption** โ AES-256-GCM, not base64 obfuscation
2. **Zero setup** โ Auto-generates master key on first use
3. **No dependencies** โ Pure Node.js `crypto`, no npm packages
4. **Safe by default** โ Masked output, never prints rotated values
5. **Transparent** โ Audit reports show exactly what's wrong
6. **Honest** โ Clear warnings about raw/inject modes, not false security claims
don't have the plugin yet? install it then click "run inline in claude" again.