op-service-accounts — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited op-service-accounts (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Two ways to give automation access to 1Password without a human:
| Service Accounts | Connect (self-hosted) | |
|---|---|---|
| Where it runs | 1Password.com | Your infra (Docker/K8s) |
| Setup | One CLI command | Run a server, generate creds |
| Network egress to 1Password.com | Per-call | Once at server boot |
| Best for | CI/CD, scripts, small-to-medium | High-throughput, on-prem, regulated |
| Vault scope | Selected vaults, granular permissions | Selected vaults |
| Personal/Private/Employee vault | No access | No access |
For most cases, service accounts. Connect when you have throughput, latency, or compliance reasons to keep the secrets path inside your network.
op service-account create <name> [flags]| Flag | Purpose |
|---|---|
--vault <vault>:<perms> | Repeatable. Permissions: read_items, write_items, share_items. write_items and share_items require read_items. Default if no perms: read_items. |
--expires-in <duration> | Token TTL — e.g., 90d, 24h, 4w. No expiry if omitted. |
--can-create-vaults | Allow the SA to create new vaults. |
--raw | Print only the token (for piping into a secret store). |
The token is shown once. Store it immediately; you can't retrieve it again.
op service-account create "ci-prod-deploy" \
--vault Prod:read_items \
--vault "CI Tokens":read_items,write_items \
--expires-in 90dTOKEN=$(op service-account create "ci-build" --vault Build:read_items --expires-in 30d --raw)
gh secret set OP_SERVICE_ACCOUNT_TOKEN --body "$TOKEN" --repo myorg/myrepo
unset TOKENexport OP_SERVICE_ACCOUNT_TOKEN="ops_..."
op vault list # works without any signin
op read op://Prod/db/password
op run --env-file=.env -- ./bin/appThe token bypasses interactive auth entirely. op signin is not needed and op whoami will report the service account identity.
op plugin init requires desktop biometric). op service-account ratelimit # show current limit + usageop service-account list(Then drill in via the desktop app for full audit history.)
Use the official action when possible:
- uses: 1password/load-secrets-action@v2
with:
export-env: true
env:
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
DATABASE_URL: op://Prod/db/connection_string
STRIPE_KEY: op://Prod/stripe/api-key
- run: ./bin/migrate && ./bin/startOr install op and use op run:
- uses: 1password/install-cli-action@v1
- run: op run --env-file=.env -- ./bin/migrate
env:
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}# Install op
curl -sSf https://cache.agilebits.com/dist/1P/op2/pkg/v2.34.0/op_linux_amd64_v2.34.0.zip | \
busybox unzip -o - -d /usr/local/bin op
chmod +x /usr/local/bin/op
# Use it
export OP_SERVICE_ACCOUNT_TOKEN="$OP_SERVICE_ACCOUNT_TOKEN"
op run --env-file=.env -- ./build.sh(Pin to a known version. Always set OP_SERVICE_ACCOUNT_TOKEN from the CI's secret store, never inline.)
FROM 1password/op:2 AS op
FROM node:20-slim
COPY --from=op /usr/local/bin/op /usr/local/bin/op
COPY .env package.json ./
RUN npm ci
COPY . .
ENTRYPOINT ["op", "run", "--env-file=.env", "--"]
CMD ["node", "server.js"]docker run --rm -e OP_SERVICE_ACCOUNT_TOKEN myappInstall the operator, create OnePasswordItem CRDs that reference items, and the operator creates corresponding Secret resources. Cleaner than running op inside containers. See <https://developer.1password.com/docs/k8s/>.
Alternative without the operator: render manifests at deploy time:
op inject -i deploy.yaml.tpl | kubectl apply -f -Run a Connect server in your infra, then op (and the SDKs) talk to it instead of 1Password.com.
# Create the server config (downloads 1password-credentials.json)
op connect server create "us-east-1" --vaults Prod,Staging
# Issue a token for the server
op connect token create "us-east-1" "deploy-token" --vaults ProdTwo artifacts:
1password-credentials.json — server's identity. Mount into the Connect container.# docker-compose.yml
services:
op-connect-api:
image: 1password/connect-api:latest
ports: ["8080:8080"]
volumes:
- ./1password-credentials.json:/home/opuser/.op/1password-credentials.json
- data:/home/opuser/.op/data
op-connect-sync:
image: 1password/connect-sync:latest
volumes:
- ./1password-credentials.json:/home/opuser/.op/1password-credentials.json
- data:/home/opuser/.op/data
volumes:
data:opexport OP_CONNECT_HOST="http://op-connect.internal:8080"
export OP_CONNECT_TOKEN="eyJ..."
op vault list # talks to Connect, not 1Password.com
op read op://Prod/db/password
op run --env-file=.env -- ./bin/appop connect server list
op connect server get "us-east-1"
op connect server edit "us-east-1" --name "us-east-1-prod"
op connect server delete "us-east-1" # invalidates all its tokens
op connect token list
op connect token create "us-east-1" "deploy" --vaults Prod
op connect token edit "us-east-1" "deploy" --name "deploy-2026"
op connect token delete "us-east-1" "deploy"
op connect vault grant "us-east-1" --vault Staging
op connect vault revoke "us-east-1" --vault OldVault
op connect group grant --group "DevOps"
op connect group revoke --group "DevOps"Token permissions inherit from the server's vault grants by default. Restrict per-token to read-only or write-only:
op connect token create "us-east-1" "read-only" --vaults Prod:r
op connect token create "us-east-1" "writer" --vaults Audit:wr = read items, w = write items, r,w = both.
Audit/event integrations (sign-in attempts, item usages, audit events) use a separate token type:
op events-api create "Splunk-prod" \
--features signinattempts,itemusages,auditevents \
[--expires-in 1y]The token is printed once. Configure your SIEM (Splunk, Elastic, Datadog, etc.) with the 1Password Events API integration using this token. Available features: signinattempts, itemusages, auditevents.
op signin. No service account needed.--expires-in and rotate. Treat them like long-lived API keys.op connect server delete invalidates every token issued for it.unauthorized, check version and consider using a JSON file you produced once interactively as your template.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.