Skip to content

ialer/tirisfal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

47 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

version license cloudflare encryption

๐Ÿ” Tirisfal

ไธบ AI Agent ่ฎพ่ฎก็š„่‡ชๆ‰˜็ฎกๅ‡ญ่ฏ็ฎก็†ๆœๅŠก

่ฟ่กŒๅœจ Cloudflare Workers ไธŠ๏ผŒๆ”ฏๆŒ Bitwarden ๅ…ผๅฎนๅ่ฎฎ


โœจ ็‰นๆ€ง

ๅŠŸ่ƒฝ ๆ่ฟฐ
๐Ÿค– Machine Accounts - ไธบๆฏไธช Agent ๅˆ›ๅปบ็‹ฌ็ซ‹็š„ๆœบๅ™จ่ดฆๅท
๐Ÿ“ Projects - ๆŒ‰้กน็›ฎๅˆ†็ป„็ฎก็†ๅ‡ญ่ฏ
๐Ÿ”‘ Secrets - ๅฎ‰ๅ…จๅญ˜ๅ‚จ API Keyใ€Tokenใ€ๅฏ†็ ็ญ‰ๅ‡ญ่ฏ
๐ŸŽซ Access Tokens - Agent ้€š่ฟ‡ Token ่ฎฟ้—ฎๅ‡ญ่ฏ
๐Ÿ“Š Audit Logs - ่ฎฐๅฝ•ๆ‰€ๆœ‰ๅ‡ญ่ฏ่ฎฟ้—ฎ่กŒไธบ
๐Ÿ”’ End-to-End Encryption - AES-256-GCM ๅŠ ๅฏ†ๅญ˜ๅ‚จ

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

้ƒจ็ฝฒ

# ๅ…‹้š†ไป“ๅบ“
git clone https://github.com/ialer/tirisfal.git
cd tirisfal

# ๅฎ‰่ฃ…ไพ่ต–
npm install

# ้…็ฝฎ็Žฏๅขƒๅ˜้‡
cp .dev.vars.example .dev.vars

# ่ฎพ็ฝฎๅฏ†้’ฅ
wrangler secret put JWT_SECRET
wrangler secret put ENCRYPTION_KEY

# ๅˆๅง‹ๅŒ–ๆ•ฐๆฎๅบ“
wrangler d1 execute tirisfal-db --file=./migrations/0001_init.sql
wrangler d1 execute tirisfal-db --file=./migrations/0002_sm_tables.sql

# ้ƒจ็ฝฒ
npm run deploy

ๆœฌๅœฐๅผ€ๅ‘

npm run dev

๐Ÿ“– ไฝฟ็”จๆŒ‡ๅ—

1๏ธโƒฃ ๅˆ›ๅปบ Machine Account

curl -X POST https://your-worker.workers.dev/api/machine-accounts \
  -H "Authorization: Bearer <user-token>" \
  -H "Content-Type: application/json" \
  -d '{"name": "my-agent", "description": "My AI Agent"}'

2๏ธโƒฃ ่Žทๅ– Access Token

curl -X POST https://your-worker.workers.dev/api/machine-accounts/<id>/token \
  -H "Authorization: Bearer <user-token>"

3๏ธโƒฃ ๅˆ›ๅปบ้กน็›ฎๅ’Œๅ‡ญ่ฏ

# ๅˆ›ๅปบ้กน็›ฎ
curl -X POST https://your-worker.workers.dev/api/projects \
  -H "Authorization: Bearer <user-token>" \
  -H "Content-Type: application/json" \
  -d '{"name": "my-project"}'

# ๅˆ›ๅปบๅ‡ญ่ฏ
curl -X POST https://your-worker.workers.dev/api/secrets \
  -H "Authorization: Bearer <user-token>" \
  -H "Content-Type: application/json" \
  -d '{"name": "API_KEY", "value": "sk-***", "project_id": "<project-id>"}'

4๏ธโƒฃ Agent ่Žทๅ–ๅ‡ญ่ฏ

curl "https://your-worker.workers.dev/api/secrets/by-name/API_KEY?project_id=<id>&environment=prod" \
  -H "Authorization: Bearer <machine-token>" | jq -r .value

๐Ÿ” ๅฎ‰ๅ…จ็‰นๆ€ง

็‰นๆ€ง ๅฎž็Žฐ
๐Ÿ”‘ AES-256-GCM - ่กŒไธšๆ ‡ๅ‡†ๅŠ ๅฏ†็ฎ—ๆณ•
๐Ÿง‚ PBKDF2 600K - OWASP ๆŽจ่่ฟญไปฃๆฌกๆ•ฐ
โฐ Token Rotation - ๆ”ฏๆŒ่‡ชๅŠจ่ฝฎๆขๅ’Œๆ’ค้”€
๐Ÿ›ก๏ธ IP Whitelist - ้™ๅˆถ่ฎฟ้—ฎๆฅๆบ
๐Ÿ• Time Window - ๅŸบไบŽๆ—ถ้—ด็š„่ฎฟ้—ฎๆŽงๅˆถ
๐Ÿ“ Audit Trail - ๅฎŒๆ•ด็š„่ฎฟ้—ฎๆ—ฅๅฟ—
๐Ÿšฆ D1 Atomic Rate Limiting - ้˜ฒ็ซžๆ€ๆกไปถ้€Ÿ็އ้™ๅˆถ
๐Ÿ”’ Constant-Time Comparison - ้˜ฒๆ—ถๅบๆ”ปๅ‡ป
๐Ÿ›ก๏ธ Project Ownership Verification - ้˜ฒ่ทจ็”จๆˆท่ฎฟ้—ฎ

ๅฎ‰ๅ…จๅฎก่ฎก

ๆœฌ้กน็›ฎ็ป่ฟ‡ๅ…จ้ขๅฎ‰ๅ…จๅฎก่ฎก๏ผŒๅทฒไฟฎๅคไปฅไธ‹้—ฎ้ข˜๏ผš

ไธฅ้‡ๆผๆดž (ๅทฒไฟฎๅค)

  • โœ… ้€Ÿ็އ้™ๅˆถ็ป•่ฟ‡ - ็งป้™คไธๅฎ‰ๅ…จ็š„ๅฏผๅ…ฅ็ป•่ฟ‡้€ป่พ‘
  • โœ… Cache API ็ซžๆ€ๆกไปถ - ๆ”น็”จ D1 ๅŽŸๅญๆ“ไฝœ้˜ฒๆญขๅนถๅ‘็ป•่ฟ‡
  • โœ… ้กน็›ฎๆ‰€ๆœ‰ๆƒ้ชŒ่ฏ็ผบๅคฑ - ๆทปๅŠ ่ทจ็”จๆˆท่ฎฟ้—ฎ้˜ฒๆŠค

้ซ˜ๅฑๆผๆดž (ๅทฒไฟฎๅค)

  • โœ… ๅธธ้‡ๆ—ถ้—ดๆฏ”่พƒๆ—ถๅบๆณ„ๆผ - ไฟฎๅค API Key ๆฏ”่พƒๅฎž็Žฐ
  • โœ… SM ็ซฏ็‚น็ผบๅฐ‘้€Ÿ็އ้™ๅˆถ - ไธบ Machine Account Token ๆทปๅŠ ้™ๆต
  • โœ… ๅ‡ญ่ฏ่ฎฟ้—ฎๅฎก่ฎก็›ฒๅŒบ - ่กฅๅ…จ GET /api/secrets/:id ๅฎก่ฎกๆ—ฅๅฟ—

้šๆ€ง้—ฎ้ข˜ (ๅทฒไฟฎๅค)

  • โœ… ๅ†…ๅญ˜ๆบขๅ‡บ้ฃŽ้™ฉ - ๅŒๆญฅๅ“ๅบ”ๆทปๅŠ  50MB ๅคงๅฐ้™ๅˆถ
  • โœ… ็ผ“ๅญ˜ๆ— ็•Œๅขž้•ฟ - AuthService ๆทปๅŠ  LRU ๆท˜ๆฑฐ็ญ–็•ฅ
  • โœ… ็™ปๅฝ•้”ๅฎš่ฟ‡ไบŽๅฎฝๆพ - ไผ˜ๅŒ–ไธบ 5ๆฌก/15ๅˆ†้’Ÿ็ญ–็•ฅ

๐Ÿ› ๏ธ API ๅ‚่€ƒ

Machine Accounts

ๆ–นๆณ• ็ซฏ็‚น ๆ่ฟฐ
POST /api/machine-accounts ๅˆ›ๅปบๆœบๅ™จ่ดฆๅท
GET /api/machine-accounts ๅˆ—ๅ‡บๆ‰€ๆœ‰ๆœบๅ™จ่ดฆๅท
GET /api/machine-accounts/:id ่Žทๅ–ๆœบๅ™จ่ดฆๅท่ฏฆๆƒ…
PUT /api/machine-accounts/:id ๆ›ดๆ–ฐๆœบๅ™จ่ดฆๅท
DELETE /api/machine-accounts/:id ๅˆ ้™คๆœบๅ™จ่ดฆๅท
POST /api/machine-accounts/:id/token ็”Ÿๆˆ่ฎฟ้—ฎไปค็‰Œ
POST /api/machine-accounts/:id/revoke-token ๆ’ค้”€่ฎฟ้—ฎไปค็‰Œ

Projects

ๆ–นๆณ• ็ซฏ็‚น ๆ่ฟฐ
POST /api/projects ๅˆ›ๅปบ้กน็›ฎ
GET /api/projects ๅˆ—ๅ‡บๆ‰€ๆœ‰้กน็›ฎ
GET /api/projects/:id ่Žทๅ–้กน็›ฎ่ฏฆๆƒ…
DELETE /api/projects/:id ๅˆ ้™ค้กน็›ฎ

Secrets

ๆ–นๆณ• ็ซฏ็‚น ๆ่ฟฐ
POST /api/secrets ๅˆ›ๅปบๅ‡ญ่ฏ
GET /api/secrets?project_id=<id> ๅˆ—ๅ‡บ้กน็›ฎไธ‹็š„ๅ‡ญ่ฏ
GET /api/secrets/:id ่Žทๅ–ๅ‡ญ่ฏ่ฏฆๆƒ…
PUT /api/secrets/:id ๆ›ดๆ–ฐๅ‡ญ่ฏ
DELETE /api/secrets/:id ๅˆ ้™คๅ‡ญ่ฏ
GET /api/secrets/by-name/:name ้€š่ฟ‡ๅ็งฐ่Žทๅ–ๅ‡ญ่ฏ

๐Ÿ“ฆ SDK

ๆˆ‘ไปฌๆไพ›ๅคš่ฏญ่จ€ SDK๏ผŒ็ฎ€ๅŒ– Agent ้›†ๆˆ๏ผš

Python

from tirisfal import TirisfalClient

client = TirisfalClient(
    server="https://your-worker.workers.dev",
    token="your-machine-account-token"
)

secret = client.get_secret("API_KEY", project_id="xxx", environment="prod")
print(secret.value)

Node.js

const { TirisfalClient } = require('@tirisfal/sdk');

const client = new TirisfalClient({
  server: 'https://your-worker.workers.dev',
  token: 'your-machine-account-token'
});

const secret = await client.getSecret('API_KEY', { projectId: 'xxx' });
console.log(secret.value);

Go

import "github.com/ialer/tirisfal/sdk/go"

client := tirisfal.NewClient("https://your-worker.workers.dev", "your-token")
secret, _ := client.GetSecret("API_KEY", "project-id", "prod")
fmt.Println(secret.Value)

๐Ÿ—๏ธ ๆžถๆž„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      Cloudflare Workers                       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚
โ”‚  โ”‚    Auth      โ”‚  โ”‚    SM API   โ”‚  โ”‚   Backup    โ”‚        โ”‚
โ”‚  โ”‚   Service    โ”‚  โ”‚   Service   โ”‚  โ”‚   Service   โ”‚        โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚
โ”‚         โ”‚                โ”‚                โ”‚                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚
โ”‚  โ”‚              SecretsManagerService             โ”‚        โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚
โ”‚                         โ”‚                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚
โ”‚  โ”‚           AES-256-GCM Encryption              โ”‚        โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚
โ”‚                         โ”‚                                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚
โ”‚  โ”‚                    D1 Database                 โ”‚        โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ”‚        โ”‚
โ”‚  โ”‚  โ”‚   secrets   โ”‚  โ”‚   projects  โ”‚            โ”‚        โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ”‚        โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ”ง ้…็ฝฎ

็Žฏๅขƒๅ˜้‡

ๅ˜้‡ ๅฟ…ๅกซ ๆ่ฟฐ
JWT_SECRET โœ… JWT ็ญพๅๅฏ†้’ฅ๏ผˆ32+ ๅญ—็ฌฆ๏ผ‰
ENCRYPTION_KEY โœ… ๅŠ ๅฏ†ๅฏ†้’ฅ๏ผˆ32+ ๅญ—็ฌฆ๏ผ‰
DB โœ… D1 ๆ•ฐๆฎๅบ“็ป‘ๅฎš
ATTACHMENTS โŒ R2 ๅญ˜ๅ‚จๆกถ๏ผˆๅฏ้€‰๏ผ‰

็”Ÿๆˆๅฏ†้’ฅ

# ็”Ÿๆˆ JWT ๅฏ†้’ฅ
openssl rand -hex 32

# ็”ŸๆˆๅŠ ๅฏ†ๅฏ†้’ฅ
openssl rand -base64 32

ๆ•ฐๆฎๅบ“่กจ

้กน็›ฎไฝฟ็”จไปฅไธ‹ D1 ๆ•ฐๆฎ่กจ๏ผš

่กจๅ ็”จ้€”
users ็”จๆˆท่ดฆๆˆท
ciphers ๅฏ†็ ้กน
folders ๆ–‡ไปถๅคน
attachments ้™„ไปถ
sends Send ๅˆ†ไบซ
refresh_tokens ๅˆทๆ–ฐไปค็‰Œ
devices ่ฎพๅค‡็ป‘ๅฎš
audit_logs ๅฎก่ฎกๆ—ฅๅฟ—
login_attempts_ip ็™ปๅฝ•ๅคฑ่ดฅ่ฎฐๅฝ•
rate_limits API ้€Ÿ็އ้™ๅˆถ
machine_accounts ๆœบๅ™จ่ดฆๅท
sm_projects ้กน็›ฎ
secrets ๅ‡ญ่ฏ
machine_account_projects ๆœบๅ™จ่ดฆๅท้กน็›ฎๆƒ้™
secret_access_logs ๅ‡ญ่ฏ่ฎฟ้—ฎๆ—ฅๅฟ—

๐Ÿ“š ๆ–‡ๆกฃ


๐Ÿค ่ดก็Œฎ

ๆฌข่ฟŽ่ดก็Œฎ๏ผ่ฏท้˜…่ฏป CONTRIBUTING.md ไบ†่งฃ่ฏฆๆƒ…ใ€‚


๐Ÿ“„ ่ฎธๅฏ่ฏ

ๆœฌ้กน็›ฎไฝฟ็”จ LGPL-3.0 ่ฎธๅฏ่ฏใ€‚


Built with โค๏ธ by SN Team

About

๐Ÿ” ่‡ชๆ‰˜็ฎกๅฏ†็ ็ฎก็†ๅ™จ | ๅ›ข้˜Ÿๅไฝœ + Agent ๅ‡ญ่ฏ่ฐƒ็”จ | Bitwarden ๅ…ผๅฎน | Cloudflare Workers ไธ€้”ฎ้ƒจ็ฝฒ

Topics

Resources

License

Contributing

Stars

2 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors