feat: sudo by default
This commit is contained in:
@@ -9,7 +9,7 @@ source "$SCRIPT_DIR/common/os-arch.sh"
|
|||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
用法: server-security-check
|
用法: server-security-check [--no-sudo]
|
||||||
|
|
||||||
快速、只读地检查以下服务器安全项:
|
快速、只读地检查以下服务器安全项:
|
||||||
- SSH 是否允许 root 或密码登录
|
- SSH 是否允许 root 或密码登录
|
||||||
@@ -19,21 +19,43 @@ usage() {
|
|||||||
- 最近 24 小时 SSH 失败登录摘要和最近成功登录来源
|
- 最近 24 小时 SSH 失败登录摘要和最近成功登录来源
|
||||||
|
|
||||||
选项:
|
选项:
|
||||||
|
-n, --no-sudo 不请求 sudo;以当前权限执行受限的只读检查
|
||||||
-h, --help 显示此帮助
|
-h, --help 显示此帮助
|
||||||
|
|
||||||
说明:
|
说明:
|
||||||
不扫描网络、不查询漏洞库、不修改配置,通常可在数秒内完成。
|
不扫描网络、不查询漏洞库、不修改配置,通常可在数秒内完成。
|
||||||
建议使用 sudo 运行,以读取 sudoers 和系统认证日志:
|
默认会请求 sudo,以读取 sudoers 和系统认证日志;可直接通过 ff s 运行:
|
||||||
sudo server-security-check
|
ff s server-security-check
|
||||||
|
若只想执行无需 sudo 的检查:
|
||||||
|
ff s server-security-check --no-sudo
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
dotfile_help_requested "${1:-}" && dotfile_show_help
|
NO_SUDO=0
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
-h|--help)
|
||||||
|
dotfile_show_help
|
||||||
|
;;
|
||||||
|
-n|--no-sudo)
|
||||||
|
NO_SUDO=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "错误: 不支持参数: $1" >&2
|
||||||
|
usage >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
if [[ $# -ne 0 ]]; then
|
if [[ $NO_SUDO -eq 0 && $EUID -ne 0 ]]; then
|
||||||
echo "错误: 不支持参数: $*" >&2
|
command -v sudo >/dev/null 2>&1 || {
|
||||||
usage >&2
|
echo "错误: 未找到 sudo;请使用 root 运行,或添加 --no-sudo 执行受限检查" >&2
|
||||||
exit 1
|
exit 1
|
||||||
|
}
|
||||||
|
echo "需要 sudo 权限以执行完整检查;请输入当前用户的密码。"
|
||||||
|
exec sudo -- "$0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PASS_COUNT=0
|
PASS_COUNT=0
|
||||||
@@ -262,7 +284,7 @@ check_privileged_accounts() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
if [[ $EUID -ne 0 ]]; then
|
||||||
info "未以 root 运行,跳过完整 sudoers 免密规则检查;可用 sudo 重跑"
|
info "未以 root 运行,跳过完整 sudoers 免密规则检查;省略 --no-sudo 可自动请求 sudo 后重跑"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -321,7 +343,7 @@ check_recent_logins() {
|
|||||||
high "最近 24 小时发现 ${failed_count} 条 SSH 失败登录记录,可能存在暴力破解"
|
high "最近 24 小时发现 ${failed_count} 条 SSH 失败登录记录,可能存在暴力破解"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
info "无法读取最近 24 小时 SSH 日志;可用 sudo 重跑,或确认日志服务正常"
|
info "无法读取最近 24 小时 SSH 日志;省略 --no-sudo 可自动请求 sudo 后重跑,或确认日志服务正常"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if command -v last >/dev/null 2>&1; then
|
if command -v last >/dev/null 2>&1; then
|
||||||
@@ -337,7 +359,11 @@ check_recent_logins() {
|
|||||||
OS_NAME=$(get_os)
|
OS_NAME=$(get_os)
|
||||||
|
|
||||||
echo "服务器快速安全检查(系统: ${OS_NAME}/$(get_arch))"
|
echo "服务器快速安全检查(系统: ${OS_NAME}/$(get_arch))"
|
||||||
echo "只读检查;建议使用 sudo 获取完整结果。"
|
if [[ $EUID -eq 0 ]]; then
|
||||||
|
echo "只读检查;已使用 sudo 权限执行完整检查。"
|
||||||
|
else
|
||||||
|
echo "只读检查;已按 --no-sudo 以当前权限执行受限检查。"
|
||||||
|
fi
|
||||||
|
|
||||||
check_ssh
|
check_ssh
|
||||||
check_listening_ports
|
check_listening_ports
|
||||||
|
|||||||
+17
-5
@@ -11,7 +11,7 @@ set -euo pipefail
|
|||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<'EOF'
|
cat <<'EOF'
|
||||||
用法: sudo ssh-harden [--user <用户名>] [--skip-key-check] [--yes]
|
用法: ssh-harden [--user <用户名>] [--skip-key-check] [--yes]
|
||||||
|
|
||||||
默认在确认目标用户已有 SSH 公钥后,直接更新 /etc/ssh/sshd_config 的全局配置:
|
默认在确认目标用户已有 SSH 公钥后,直接更新 /etc/ssh/sshd_config 的全局配置:
|
||||||
PubkeyAuthentication yes
|
PubkeyAuthentication yes
|
||||||
@@ -24,12 +24,13 @@ usage() {
|
|||||||
-u, --user <用户名> 要确认公钥的用户;默认使用调用 sudo 前的用户
|
-u, --user <用户名> 要确认公钥的用户;默认使用调用 sudo 前的用户
|
||||||
-k, --skip-key-check 跳过本地 authorized_keys 与权限检查
|
-k, --skip-key-check 跳过本地 authorized_keys 与权限检查
|
||||||
-y, --yes 跳过交互确认
|
-y, --yes 跳过交互确认
|
||||||
|
-n, --no-sudo 不自动请求 sudo(本脚本必须使用 root,因而会直接退出)
|
||||||
-h, --help 显示此帮助
|
-h, --help 显示此帮助
|
||||||
|
|
||||||
示例:
|
示例:
|
||||||
sudo ssh-harden
|
ff s ssh-harden
|
||||||
sudo ssh-harden --user deploy
|
ff s ssh-harden --user deploy
|
||||||
sudo ssh-harden -k
|
ff s ssh-harden -k
|
||||||
|
|
||||||
重要说明:
|
重要说明:
|
||||||
- 仅支持使用 systemd 管理 SSH 服务的 Linux 服务器。
|
- 仅支持使用 systemd 管理 SSH 服务的 Linux 服务器。
|
||||||
@@ -42,11 +43,13 @@ usage() {
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ORIGINAL_ARGS=("$@")
|
||||||
TARGET_USER="${SUDO_USER:-}"
|
TARGET_USER="${SUDO_USER:-}"
|
||||||
ASSUME_YES=0
|
ASSUME_YES=0
|
||||||
SSH_PORT=55522
|
SSH_PORT=55522
|
||||||
UFW_RULE_ADDED=0
|
UFW_RULE_ADDED=0
|
||||||
SKIP_KEY_CHECK=0
|
SKIP_KEY_CHECK=0
|
||||||
|
NO_SUDO=0
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@@ -66,6 +69,10 @@ while [[ $# -gt 0 ]]; do
|
|||||||
SKIP_KEY_CHECK=1
|
SKIP_KEY_CHECK=1
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
-n|--no-sudo)
|
||||||
|
NO_SUDO=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "错误: 不支持参数: $1" >&2
|
echo "错误: 不支持参数: $1" >&2
|
||||||
usage >&2
|
usage >&2
|
||||||
@@ -239,7 +246,12 @@ write_hardened_config() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
if [[ $EUID -ne 0 ]]; then
|
||||||
die "请使用 sudo 运行,例如: sudo $0${TARGET_USER:+ --user "$TARGET_USER"}"
|
if [[ $NO_SUDO -eq 1 ]]; then
|
||||||
|
die "ssh-harden 必须使用 root;请移除 --no-sudo 后重试"
|
||||||
|
fi
|
||||||
|
command -v sudo >/dev/null 2>&1 || die "未找到 sudo;请使用 root 运行"
|
||||||
|
echo "需要 sudo 权限以修改 SSH 配置;请输入当前用户的密码。"
|
||||||
|
exec sudo -- "$0" "${ORIGINAL_ARGS[@]}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[[ "$(get_os)" == "linux" ]] || die "当前仅支持 systemd 管理 SSH 服务的 Linux 服务器"
|
[[ "$(get_os)" == "linux" ]] || die "当前仅支持 systemd 管理 SSH 服务的 Linux 服务器"
|
||||||
|
|||||||
Reference in New Issue
Block a user