docs: Add secure GitHub access guide for cloud agents (deploy keys recommended)
This commit is contained in:
parent
ddac456e0a
commit
fa07454a51
1 changed files with 420 additions and 0 deletions
420
SECURE_GITHUB_ACCESS_FOR_CLOUD.md
Normal file
420
SECURE_GITHUB_ACCESS_FOR_CLOUD.md
Normal file
|
|
@ -0,0 +1,420 @@
|
||||||
|
# Secure GitHub Access for Cloud Agents
|
||||||
|
|
||||||
|
**Problem:** Cloud agents on StackCP need read access to private repo `dannystocker/navidocs`
|
||||||
|
**Security Goal:** No exposure of main GitHub credentials, revokable access, minimal permissions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Option 1: GitHub Deploy Keys (RECOMMENDED)
|
||||||
|
|
||||||
|
**Best for:** Read-only access to a single private repo
|
||||||
|
**Security:** Excellent - key only works for one repo, easily revokable
|
||||||
|
|
||||||
|
### How It Works
|
||||||
|
1. Generate SSH key pair on StackCP
|
||||||
|
2. Add public key to GitHub repo as "Deploy Key" (read-only)
|
||||||
|
3. Cloud agents use private key to clone/pull
|
||||||
|
4. Key never leaves StackCP server
|
||||||
|
|
||||||
|
### Setup Steps (10 minutes)
|
||||||
|
|
||||||
|
#### Step 1: Generate Deploy Key on StackCP
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# SSH to StackCP
|
||||||
|
ssh stackcp
|
||||||
|
|
||||||
|
# Generate dedicated key (no passphrase for automation)
|
||||||
|
ssh-keygen -t ed25519 -C "navidocs-cloud-deploy" -f ~/.ssh/navidocs_deploy_key -N ""
|
||||||
|
|
||||||
|
# This creates:
|
||||||
|
# ~/.ssh/navidocs_deploy_key (private - keep secure!)
|
||||||
|
# ~/.ssh/navidocs_deploy_key.pub (public - add to GitHub)
|
||||||
|
|
||||||
|
# Display public key to copy
|
||||||
|
cat ~/.ssh/navidocs_deploy_key.pub
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 2: Add Deploy Key to GitHub
|
||||||
|
|
||||||
|
1. Go to: https://github.com/dannystocker/navidocs/settings/keys
|
||||||
|
2. Click "Add deploy key"
|
||||||
|
3. Title: `StackCP Cloud Agents (Read-Only)`
|
||||||
|
4. Key: Paste the contents of `navidocs_deploy_key.pub`
|
||||||
|
5. ✅ **IMPORTANT:** Leave "Allow write access" UNCHECKED (read-only)
|
||||||
|
6. Click "Add key"
|
||||||
|
|
||||||
|
#### Step 3: Configure Git on StackCP
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Still on StackCP
|
||||||
|
cat >> ~/.ssh/config << 'EOF'
|
||||||
|
Host github.com-navidocs
|
||||||
|
HostName github.com
|
||||||
|
User git
|
||||||
|
IdentityFile ~/.ssh/navidocs_deploy_key
|
||||||
|
IdentitiesOnly yes
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod 600 ~/.ssh/config
|
||||||
|
|
||||||
|
# Test connection
|
||||||
|
ssh -T git@github.com-navidocs
|
||||||
|
# Should see: "Hi dannystocker/navidocs! You've successfully authenticated..."
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 4: Clone Repo Using Deploy Key
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone using the deploy key
|
||||||
|
git clone git@github.com-navidocs:dannystocker/navidocs.git ~/navidocs-cloud
|
||||||
|
|
||||||
|
# Or if already cloned, update remote
|
||||||
|
cd ~/navidocs-cloud
|
||||||
|
git remote set-url origin git@github.com-navidocs:dannystocker/navidocs.git
|
||||||
|
|
||||||
|
# Test pull
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 5: Cloud Agents Use It
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# In cloud agent script
|
||||||
|
cd ~/navidocs-cloud
|
||||||
|
git fetch origin
|
||||||
|
git checkout mvp-demo-build
|
||||||
|
git pull
|
||||||
|
|
||||||
|
# Private key is automatically used via SSH config
|
||||||
|
```
|
||||||
|
|
||||||
|
### Security Benefits
|
||||||
|
- ✅ Key only works for `dannystocker/navidocs` (not other repos)
|
||||||
|
- ✅ Read-only access (agents can't push)
|
||||||
|
- ✅ Revokable instantly from GitHub UI
|
||||||
|
- ✅ No main GitHub credentials exposed
|
||||||
|
- ✅ Key never transmitted (stays on StackCP)
|
||||||
|
|
||||||
|
### Revocation (if compromised)
|
||||||
|
1. Go to: https://github.com/dannystocker/navidocs/settings/keys
|
||||||
|
2. Find "StackCP Cloud Agents (Read-Only)"
|
||||||
|
3. Click "Delete"
|
||||||
|
4. Access immediately revoked
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Option 2: GitHub Personal Access Token (Fine-Grained)
|
||||||
|
|
||||||
|
**Best for:** More control over permissions and expiration
|
||||||
|
**Security:** Good - token can be scoped and expires
|
||||||
|
|
||||||
|
### How It Works
|
||||||
|
1. Create fine-grained token with read-only access to `navidocs` repo
|
||||||
|
2. Store token in StackCP environment variable
|
||||||
|
3. Use HTTPS clone with token authentication
|
||||||
|
|
||||||
|
### Setup Steps
|
||||||
|
|
||||||
|
#### Step 1: Create Fine-Grained Token
|
||||||
|
|
||||||
|
1. Go to: https://github.com/settings/tokens?type=beta
|
||||||
|
2. Click "Generate new token" → "Generate new token (Beta)"
|
||||||
|
3. Settings:
|
||||||
|
- **Token name:** `NaviDocs Cloud Agents (Read-Only)`
|
||||||
|
- **Expiration:** 90 days (or custom)
|
||||||
|
- **Repository access:** Only select repositories → `dannystocker/navidocs`
|
||||||
|
- **Permissions:**
|
||||||
|
- Repository permissions:
|
||||||
|
- Contents: **Read-only** ✅
|
||||||
|
- Metadata: **Read-only** ✅ (auto-selected)
|
||||||
|
- DO NOT grant any write permissions
|
||||||
|
4. Click "Generate token"
|
||||||
|
5. **COPY TOKEN IMMEDIATELY** (you won't see it again!)
|
||||||
|
|
||||||
|
#### Step 2: Store Token Securely on StackCP
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh stackcp
|
||||||
|
|
||||||
|
# Store in secure file (readable only by you)
|
||||||
|
echo "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" > ~/.navidocs_github_token
|
||||||
|
chmod 600 ~/.navidocs_github_token
|
||||||
|
|
||||||
|
# Or in environment variable
|
||||||
|
echo 'export NAVIDOCS_GITHUB_TOKEN="ghp_xxxxx..."' >> ~/.bashrc
|
||||||
|
source ~/.bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 3: Clone with Token
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Read token from file
|
||||||
|
TOKEN=$(cat ~/.navidocs_github_token)
|
||||||
|
|
||||||
|
# Clone using token
|
||||||
|
git clone https://x-access-token:${TOKEN}@github.com/dannystocker/navidocs.git ~/navidocs-cloud
|
||||||
|
|
||||||
|
# Or configure credential helper
|
||||||
|
git config --global credential.helper store
|
||||||
|
echo "https://x-access-token:${TOKEN}@github.com" > ~/.git-credentials
|
||||||
|
chmod 600 ~/.git-credentials
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 4: Cloud Agents Use It
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Token is automatically used
|
||||||
|
cd ~/navidocs-cloud
|
||||||
|
git pull origin mvp-demo-build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Security Benefits
|
||||||
|
- ✅ Fine-grained permissions (only Contents: Read)
|
||||||
|
- ✅ Auto-expires after 90 days
|
||||||
|
- ✅ Can be scoped to specific repos
|
||||||
|
- ✅ Revokable from GitHub settings
|
||||||
|
|
||||||
|
### Revocation
|
||||||
|
1. Go to: https://github.com/settings/tokens?type=beta
|
||||||
|
2. Find "NaviDocs Cloud Agents (Read-Only)"
|
||||||
|
3. Click "Delete"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Option 3: SSH Agent Forwarding (MOST SECURE)
|
||||||
|
|
||||||
|
**Best for:** Using your local credentials without storing on StackCP
|
||||||
|
**Security:** Excellent - no keys stored on cloud server
|
||||||
|
|
||||||
|
### How It Works
|
||||||
|
1. Your local SSH key is forwarded through SSH connection
|
||||||
|
2. Cloud agent uses YOUR credentials via the tunnel
|
||||||
|
3. No keys stored on StackCP
|
||||||
|
|
||||||
|
### Setup Steps
|
||||||
|
|
||||||
|
#### Step 1: Enable SSH Agent Forwarding Locally
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On your local machine
|
||||||
|
# Ensure SSH agent is running
|
||||||
|
eval "$(ssh-agent -s)"
|
||||||
|
|
||||||
|
# Add your GitHub key
|
||||||
|
ssh-add ~/.ssh/id_ed25519 # or your GitHub key
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
ssh-add -l
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 2: Configure SSH Forwarding
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Edit ~/.ssh/config on local machine
|
||||||
|
cat >> ~/.ssh/config << 'EOF'
|
||||||
|
Host stackcp
|
||||||
|
HostName ssh.gb.stackcp.com
|
||||||
|
User digital-lab.ca
|
||||||
|
ForwardAgent yes
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 3: Test Forwarding
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# SSH to StackCP with agent forwarding
|
||||||
|
ssh stackcp
|
||||||
|
|
||||||
|
# From StackCP, test GitHub access (using YOUR local key!)
|
||||||
|
ssh -T git@github.com
|
||||||
|
# Should see: "Hi dannystocker! You've successfully authenticated..."
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 4: Clone Repo
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On StackCP (using forwarded credentials)
|
||||||
|
git clone git@github.com:dannystocker/navidocs.git ~/navidocs-cloud
|
||||||
|
```
|
||||||
|
|
||||||
|
### Security Benefits
|
||||||
|
- ✅ No keys stored on StackCP
|
||||||
|
- ✅ Uses your existing GitHub access
|
||||||
|
- ✅ Automatic when you SSH to StackCP
|
||||||
|
- ✅ Stops working when you disconnect
|
||||||
|
|
||||||
|
### Limitations
|
||||||
|
- ❌ Only works while you're SSH'd in
|
||||||
|
- ❌ Cloud agents can't run autonomously
|
||||||
|
- ❌ Not suitable for automated background tasks
|
||||||
|
|
||||||
|
**NOT RECOMMENDED for this use case** (agents need to run autonomously)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Comparison Table
|
||||||
|
|
||||||
|
| Feature | Deploy Keys | Fine-Grained Token | SSH Forwarding |
|
||||||
|
|---------|-------------|-------------------|----------------|
|
||||||
|
| **Setup Time** | 10 min | 5 min | 2 min |
|
||||||
|
| **Autonomous Use** | ✅ Yes | ✅ Yes | ❌ No (requires SSH session) |
|
||||||
|
| **Read-Only** | ✅ Enforced | ✅ Configurable | ❌ Uses your full access |
|
||||||
|
| **Revokable** | ✅ Instant | ✅ Instant | ✅ Auto (on disconnect) |
|
||||||
|
| **Repo-Specific** | ✅ Yes | ✅ Yes | ❌ All repos you access |
|
||||||
|
| **Key Storage** | StackCP only | StackCP only | Local only |
|
||||||
|
| **Expiration** | None | Configurable | Per session |
|
||||||
|
| **Best For** | Cloud agents | Temp access | Interactive use |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## RECOMMENDED SOLUTION: Deploy Keys + Environment Security
|
||||||
|
|
||||||
|
### Complete Secure Setup (15 minutes)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# ============================================
|
||||||
|
# STEP 1: Generate deploy key on StackCP
|
||||||
|
# ============================================
|
||||||
|
ssh stackcp << 'SETUP'
|
||||||
|
# Generate key
|
||||||
|
ssh-keygen -t ed25519 -C "navidocs-cloud-$(date +%Y%m%d)" \
|
||||||
|
-f ~/.ssh/navidocs_deploy_key -N ""
|
||||||
|
|
||||||
|
# Secure permissions
|
||||||
|
chmod 700 ~/.ssh
|
||||||
|
chmod 600 ~/.ssh/navidocs_deploy_key
|
||||||
|
chmod 644 ~/.ssh/navidocs_deploy_key.pub
|
||||||
|
|
||||||
|
# Configure SSH
|
||||||
|
cat >> ~/.ssh/config << 'EOF'
|
||||||
|
Host github.com-navidocs
|
||||||
|
HostName github.com
|
||||||
|
User git
|
||||||
|
IdentityFile ~/.ssh/navidocs_deploy_key
|
||||||
|
IdentitiesOnly yes
|
||||||
|
StrictHostKeyChecking no
|
||||||
|
EOF
|
||||||
|
chmod 600 ~/.ssh/config
|
||||||
|
|
||||||
|
# Display public key
|
||||||
|
echo "========================================"
|
||||||
|
echo "ADD THIS PUBLIC KEY TO GITHUB:"
|
||||||
|
echo "https://github.com/dannystocker/navidocs/settings/keys"
|
||||||
|
echo "========================================"
|
||||||
|
cat ~/.ssh/navidocs_deploy_key.pub
|
||||||
|
echo "========================================"
|
||||||
|
SETUP
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# STEP 2: Add public key to GitHub manually
|
||||||
|
# ============================================
|
||||||
|
# (You must do this in browser - see above)
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# STEP 3: Test and clone on StackCP
|
||||||
|
# ============================================
|
||||||
|
ssh stackcp << 'TEST'
|
||||||
|
# Test connection
|
||||||
|
ssh -T git@github.com-navidocs
|
||||||
|
|
||||||
|
# Clone repo
|
||||||
|
git clone git@github.com-navidocs:dannystocker/navidocs.git ~/navidocs-cloud
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
cd ~/navidocs-cloud
|
||||||
|
git remote -v
|
||||||
|
git branch -a
|
||||||
|
|
||||||
|
echo "✅ Secure GitHub access configured!"
|
||||||
|
TEST
|
||||||
|
```
|
||||||
|
|
||||||
|
### Additional Security Hardening
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On StackCP: Restrict file permissions
|
||||||
|
ssh stackcp << 'SECURE'
|
||||||
|
# Ensure home directory is not world-readable
|
||||||
|
chmod 750 ~
|
||||||
|
|
||||||
|
# Secure SSH directory
|
||||||
|
chmod 700 ~/.ssh
|
||||||
|
chmod 600 ~/.ssh/navidocs_deploy_key
|
||||||
|
|
||||||
|
# Secure navidocs directory
|
||||||
|
chmod 750 ~/navidocs-cloud
|
||||||
|
|
||||||
|
# Create audit log
|
||||||
|
echo "$(date): Deploy key created for navidocs cloud agents" >> ~/.security_audit.log
|
||||||
|
chmod 600 ~/.security_audit.log
|
||||||
|
SECURE
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Security Checklist
|
||||||
|
|
||||||
|
Before deploying cloud agents:
|
||||||
|
|
||||||
|
- [ ] Deploy key generated on StackCP (not local machine)
|
||||||
|
- [ ] Public key added to GitHub with **Read-only** access
|
||||||
|
- [ ] Private key permissions set to 600
|
||||||
|
- [ ] SSH config uses IdentitiesOnly yes
|
||||||
|
- [ ] Test clone/pull works
|
||||||
|
- [ ] Document key creation in security audit log
|
||||||
|
- [ ] Set calendar reminder to rotate key in 6 months
|
||||||
|
- [ ] Store backup of public key locally (for audit trail)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Rotation Schedule
|
||||||
|
|
||||||
|
**Recommended:** Rotate deploy keys every 6 months
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create calendar reminder
|
||||||
|
echo "2025-05-13: Rotate NaviDocs StackCP deploy key" >> ~/security-reminders.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
**Rotation process:**
|
||||||
|
1. Generate new deploy key on StackCP
|
||||||
|
2. Add new public key to GitHub (keep old key active)
|
||||||
|
3. Update git config to use new key
|
||||||
|
4. Test clone/pull with new key
|
||||||
|
5. Remove old deploy key from GitHub
|
||||||
|
6. Delete old private key from StackCP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Emergency Revocation
|
||||||
|
|
||||||
|
If you suspect the deploy key is compromised:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Revoke from GitHub immediately
|
||||||
|
# Go to: https://github.com/dannystocker/navidocs/settings/keys
|
||||||
|
# Delete the deploy key
|
||||||
|
|
||||||
|
# 2. Rotate key on StackCP
|
||||||
|
ssh stackcp "rm ~/.ssh/navidocs_deploy_key*"
|
||||||
|
|
||||||
|
# 3. Generate new key (follow setup steps above)
|
||||||
|
|
||||||
|
# 4. Update security audit log
|
||||||
|
ssh stackcp "echo '$(date): EMERGENCY - Deploy key revoked and rotated' >> ~/.security_audit.log"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Status: READY TO IMPLEMENT
|
||||||
|
|
||||||
|
**Recommended:** Deploy Keys (Option 1)
|
||||||
|
|
||||||
|
**Next steps:**
|
||||||
|
1. Run the complete setup script above (15 min)
|
||||||
|
2. Test clone/pull from StackCP
|
||||||
|
3. Document in security audit log
|
||||||
|
4. Deploy cloud agents
|
||||||
|
|
||||||
|
**Security level:** ✅ Production-ready
|
||||||
Loading…
Add table
Reference in a new issue