163 lines
5.1 KiB
Bash
Executable File
163 lines
5.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# Verify and Pull Script
|
|
#
|
|
# This script verifies ATProto signatures before pulling images with Docker.
|
|
# It acts as a wrapper around `docker pull` to enforce signature verification.
|
|
#
|
|
# Usage: ./verify-and-pull.sh IMAGE [DOCKER_PULL_OPTIONS]
|
|
# Example: ./verify-and-pull.sh atcr.io/alice/myapp:latest
|
|
# Example: ./verify-and-pull.sh atcr.io/alice/myapp:latest --platform linux/amd64
|
|
#
|
|
# To use this as a replacement for docker pull, create an alias:
|
|
# alias docker-pull-secure='/path/to/verify-and-pull.sh'
|
|
|
|
set -e
|
|
|
|
# Configuration
|
|
VERIFY_SCRIPT="${VERIFY_SCRIPT:-$(dirname $0)/atcr-verify.sh}"
|
|
TRUST_POLICY="${TRUST_POLICY:-$(dirname $0)/trust-policy.yaml}"
|
|
REQUIRE_VERIFICATION="${REQUIRE_VERIFICATION:-true}"
|
|
SKIP_ATCR_IMAGES="${SKIP_ATCR_IMAGES:-false}" # Skip verification for non-ATCR images
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
print_header() {
|
|
echo ""
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════${NC}"
|
|
echo -e "${BLUE} Secure Image Pull with Signature Verification${NC}"
|
|
echo -e "${BLUE}═══════════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "${GREEN}✓${NC} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}✗${NC} $1"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}⚠${NC} $1"
|
|
}
|
|
|
|
# Check if image is from ATCR
|
|
is_atcr_image() {
|
|
local image="$1"
|
|
if [[ "$image" =~ ^atcr\.io/ ]]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Main function
|
|
main() {
|
|
if [ $# -eq 0 ]; then
|
|
echo "Usage: $0 IMAGE [DOCKER_PULL_OPTIONS]"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 atcr.io/alice/myapp:latest"
|
|
echo " $0 atcr.io/alice/myapp:latest --platform linux/amd64"
|
|
echo ""
|
|
echo "Environment variables:"
|
|
echo " VERIFY_SCRIPT - Path to verification script (default: ./atcr-verify.sh)"
|
|
echo " TRUST_POLICY - Path to trust policy (default: ./trust-policy.yaml)"
|
|
echo " REQUIRE_VERIFICATION - Require verification for ATCR images (default: true)"
|
|
echo " SKIP_ATCR_IMAGES - Skip verification for non-ATCR images (default: false)"
|
|
exit 1
|
|
fi
|
|
|
|
local image="$1"
|
|
shift
|
|
local docker_args="$@"
|
|
|
|
print_header
|
|
|
|
echo -e "${BLUE}Image:${NC} $image"
|
|
if [ -n "$docker_args" ]; then
|
|
echo -e "${BLUE}Docker options:${NC} $docker_args"
|
|
fi
|
|
echo ""
|
|
|
|
# Check if this is an ATCR image
|
|
if ! is_atcr_image "$image"; then
|
|
if [ "$SKIP_ATCR_IMAGES" = "true" ]; then
|
|
print_warning "Not an ATCR image - skipping signature verification"
|
|
echo ""
|
|
docker pull $docker_args "$image"
|
|
exit $?
|
|
else
|
|
print_warning "Not an ATCR image"
|
|
if [ "$REQUIRE_VERIFICATION" = "true" ]; then
|
|
print_error "Verification required but image is not from ATCR"
|
|
exit 1
|
|
else
|
|
print_warning "Proceeding without verification"
|
|
echo ""
|
|
docker pull $docker_args "$image"
|
|
exit $?
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Step 1: Verify signature
|
|
echo -e "${BLUE}Step 1: Verifying ATProto signature${NC}"
|
|
echo ""
|
|
|
|
if [ ! -f "$VERIFY_SCRIPT" ]; then
|
|
print_error "Verification script not found: $VERIFY_SCRIPT"
|
|
exit 1
|
|
fi
|
|
|
|
# Run verification
|
|
if bash "$VERIFY_SCRIPT" "$image"; then
|
|
print_success "Signature verification passed"
|
|
echo ""
|
|
else
|
|
print_error "Signature verification failed"
|
|
echo ""
|
|
|
|
if [ "$REQUIRE_VERIFICATION" = "true" ]; then
|
|
echo -e "${RED}Image pull blocked due to failed signature verification${NC}"
|
|
echo ""
|
|
echo "To proceed anyway (NOT RECOMMENDED), run:"
|
|
echo " REQUIRE_VERIFICATION=false $0 $image $docker_args"
|
|
exit 1
|
|
else
|
|
print_warning "Verification failed but REQUIRE_VERIFICATION=false"
|
|
print_warning "Proceeding with pull (NOT RECOMMENDED)"
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
# Step 2: Pull image
|
|
echo -e "${BLUE}Step 2: Pulling image${NC}"
|
|
echo ""
|
|
|
|
if docker pull $docker_args "$image"; then
|
|
print_success "Image pulled successfully"
|
|
else
|
|
print_error "Failed to pull image"
|
|
exit 1
|
|
fi
|
|
|
|
# Summary
|
|
echo ""
|
|
echo -e "${GREEN}═══════════════════════════════════════════════════${NC}"
|
|
echo -e "${GREEN} ✓ Secure pull completed successfully${NC}"
|
|
echo -e "${GREEN}═══════════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
echo -e "${BLUE}Image:${NC} $image"
|
|
echo -e "${BLUE}Status:${NC} Verified and pulled"
|
|
echo ""
|
|
}
|
|
|
|
# Run main function
|
|
main "$@"
|