本文目录导读:

Git 钩子脚本可以通过多种方式检查密码策略,以下是几种常见方法:
使用 pre-commit 钩子检查硬编码密码
#!/bin/bash
# .git/hooks/pre-commit
# 需要检查的文件类型
FILE_TYPES="*.py *.js *.java *.properties *.yml *.yaml *.json *.xml"
# 密码相关的正则表达式模式
PASSWORD_PATTERNS=(
"(password|passwd|pwd|secret|secretkey)['\"]?\s*[:=]\s*['\"][^'\"]+['\"]"
"password:\s+\S+"
"passwd=\S+"
)
echo "检查密码硬编码..."
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)
for FILE in $STAGED_FILES; do
# 检查文件类型
for PATTERN in "${FILE_TYPES[@]}"; do
if [[ "$FILE" == $PATTERN ]]; then
# 检查每个模式
for PATTERN in "${PASSWORD_PATTERNS[@]}"; do
if grep -q -E "$PATTERN" "$FILE"; then
echo "错误: 在文件 $FILE 中发现潜在密码硬编码"
echo "请删除或替换为环境变量"
exit 1
fi
done
fi
done
done
检查密码复杂度
#!/bin/bash
# .git/hooks/pre-receive - 服务器端钩子
# 密码复杂度要求
MIN_LENGTH=8
MIN_UPPERCASE=1
MIN_LOWERCASE=1
MIN_DIGITS=1
MIN_SPECIAL=1
check_password_complexity() {
local password=$1
# 检查长度
if [ ${#password} -lt $MIN_LENGTH ]; then
echo "密码长度至少需要 $MIN_LENGTH 个字符"
return 1
fi
# 检查大写字母
if [[ ! "$password" =~ [A-Z]{$MIN_UPPERCASE,} ]]; then
echo "密码需要至少 $MIN_UPPERCASE 个大写字母"
return 1
fi
# 检查小写字母
if [[ ! "$password" =~ [a-z]{$MIN_LOWERCASE,} ]]; then
echo "密码需要至少 $MIN_LOWERCASE 个小写字母"
return 1
fi
# 检查数字
if [[ ! "$password" =~ [0-9]{$MIN_DIGITS,} ]]; then
echo "密码需要至少 $MIN_DIGITS 个数字"
return 1
fi
# 检查特殊字符
if [[ ! "$password" =~ [!@#$%^&*()_+\-=\[\]{};':\"\\|,.<>\/?]{$MIN_SPECIAL,} ]]; then
echo "密码需要至少 $MIN_SPECIAL 个特殊字符"
return 1
fi
return 0
}
检查常见弱密码
#!/bin/bash
# .git/hooks/pre-receive
# 常见弱密码列表
WEAK_PASSWORDS=(
"password"
"password123"
"12345678"
"qwerty"
"admin"
"letmein"
"welcome"
"monkey"
"dragon"
"master"
"123456789"
"1234567890"
"test"
"guest"
)
check_weak_password() {
local password=$1
for weak in "${WEAK_PASSWORDS[@]}"; do
if [[ "${password,,}" == "$weak" ]]; then
echo "错误: 使用弱密码 '$password'"
return 1
fi
done
return 0
}
完整的密码策略检查脚本
#!/bin/bash
# .git/hooks/pre-commit
# 配置
MIN_PASSWORD_LENGTH=12
MAX_PASSWORD_LENGTH=64
WEAK_PASSWORD_FILE="/etc/git/weak_passwords.txt"
PASSWORD_REGEX='^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{12,}$'
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
check_password_policy() {
local password=$1
local errors=()
# 1. 长度检查
if [ ${#password} -lt $MIN_PASSWORD_LENGTH ]; then
errors+=("密码长度不能少于 $MIN_PASSWORD_LENGTH 个字符")
fi
if [ ${#password} -gt $MAX_PASSWORD_LENGTH ]; then
errors+=("密码长度不能超过 $MAX_PASSWORD_LENGTH 个字符")
fi
# 2. 字符类型检查
if ! [[ "$password" =~ [A-Z] ]]; then
errors+=("密码需要至少包含1个大写字母")
fi
if ! [[ "$password" =~ [a-z] ]]; then
errors+=("密码需要至少包含1个小写字母")
fi
if ! [[ "$password" =~ [0-9] ]]; then
errors+=("密码需要至少包含1个数字")
fi
if ! [[ "$password" =~ [!@#$%^&*()_+\-=\[\]{};':\"\\|,.<>\/?] ]]; then
errors+=("密码需要至少包含1个特殊字符")
fi
# 3. 连续字符检查 (不允许3个以上连续相同字符)
if [[ "$password" =~ (.)\1{2,} ]]; then
errors+=("密码不允许3个以上连续相同字符")
fi
# 4. 常见顺序检查
if [[ "$password" =~ (abc|bcd|cde|def|123|234|345|456|567|678|789|890|qwe|wer|ert|rty|tyu|yui|uio|iop|asd|sdf|dfg|fgh|ghj|hjk|jkl|zxc|xcv|cvb|vbn|bnm) ]]; then
errors+=("密码不允许包含常见顺序字符")
fi
# 5. 键盘模式检查
KEYBOARD_PATTERNS=("qwerty" "asdfgh" "zxcvbn" "qwert" "werty" "erty" "rtyu" "tyui" "yuio" "uiop")
for pattern in "${KEYBOARD_PATTERNS[@]}"; do
if echo "$password" | grep -qi "$pattern"; then
errors+=("密码不允许包含键盘连续模式")
break
fi
done
# 输出错误
if [ ${#errors[@]} -gt 0 ]; then
echo -e "${RED}密码策略检查失败:${NC}"
for error in "${errors[@]}"; do
echo -e "${RED} - $error${NC}"
done
return 1
fi
echo -e "${GREEN}密码策略检查通过${NC}"
return 0
}
# 检查暂存区中的密码文件
PASSWORD_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -i "password\|credential\|secret")
for FILE in $PASSWORD_FILES; do
echo "检查文件: $FILE"
while IFS= read -r line; do
# 提取行中的密码(假设格式为 password=xxx 或 password: xxx)
if [[ $line =~ (password|passwd|pwd)[=:]\s*([^\s]+) ]]; then
password="${BASH_REMATCH[2]}"
# 移除引号
password="${password%[\'\"]}"
password="${password#[\'\"\"]}"
if ! check_password_policy "$password"; then
exit 1
fi
fi
done < "$FILE"
done
exit 0
安装和配置钩子
# 创建钩子文件 cp pre-commit-hook .git/hooks/pre-commit chmod +x .git/hooks/pre-commit # 或者创建全局钩子(适用于所有仓库) git config --global core.hooksPath ~/.git-hooks mkdir ~/.git-hooks cp pre-commit-hook ~/.git-hooks/pre-commit chmod +x ~/.git-hooks/pre-commit
使用专用工具集成
#!/bin/bash
# 集成 git-secrets(推荐用于 AWS 密钥检查)
# 安装 git-secrets
# brew install git-secrets # macOS
# apt-get install git-secrets # Ubuntu
# 在仓库中设置
init_repo() {
git secrets --install
git secrets --register-aws
# 添加自定义模式
git secrets --add 'password\s*=\s*.*'
git secrets --add 'passwd\s*=\s*.*'
git secrets --add 'secret\s*=\s*.*'
git secrets --add 'api.key\s*=\s*.*'
# 添加禁止提交的文件模式
git secrets --add --allowed 'password\s*=\s*.*changeme'
git secrets --add --allowed 'password\s*=\s*.*example'
}
建议
- 使用预定义的正则表达式库:如
truffleHog、git-secrets等 - 分级检查:根据敏感程度设置不同级别的检查
- 白名单机制:允许特定模式(如测试密码)通过
- 定期更新:密码策略应定期更新
- 日志记录:记录所有密码检查失败的事件
- 提示用户:提供清晰的错误信息和建议
这些脚本可以有效地防止密码硬编码和弱密码提交到代码库中。