系统安全及应用

一、账号安全控制

1. 基本安全措施

1.1 系统账号清理

bash

复制代码
# 查看所有用户账号
cat /etc/passwd
cat /etc/shadow

# 查看所有组账号
cat /etc/group
cat /etc/gshadow

# 查看当前登录用户
who
w
last
lastlog

# 锁定不需要的账号
usermod -L username    # 锁定用户
passwd -l username     # 锁定用户密码
usermod -U username    # 解锁用户
passwd -u username     # 解锁用户密码

# 删除不必要的账号
userdel -r username    # 删除用户及其家目录
groupdel groupname     # 删除组

# 设置账号过期时间
usermod -e 2024-12-31 username    # 设置账号过期日期
chage -E 2024-12-31 username       # 同上
chage -M 90 username               # 设置密码最长使用天数
chage -m 7 username                 # 设置密码最短使用天数
chage -W 7 username                 # 密码过期前7天警告

# 查看账号过期信息
chage -l username

# 示例:批量清理系统账号
#!/bin/bash
# 锁定除了root和自己之外的所有用户
for user in $(awk -F: '$3>=1000 {print $1}' /etc/passwd); do
    if [ "$user" != "root" ] && [ "$user" != "$LOGNAME" ]; then
        usermod -L $user
        echo "已锁定用户: $user"
    fi
done
1.2 密码安全控制

bash

复制代码
# 修改密码策略配置文件
vim /etc/login.defs

# 密码策略设置
PASS_MAX_DAYS   90      # 密码最长有效期
PASS_MIN_DAYS   7       # 密码最短使用时间
PASS_MIN_LEN    8       # 密码最小长度
PASS_WARN_AGE   7       # 密码过期前警告天数

# 使用chage命令设置密码策略
chage -M 90 -m 7 -W 7 username

# 对所有用户应用密码策略
for user in $(awk -F: '$3>=1000 {print $1}' /etc/passwd); do
    chage -M 90 $user
done

# 设置密码复杂度(需要安装pam_cracklib)
vim /etc/pam.d/system-auth

# 添加以下行
password requisite pam_cracklib.so retry=3 difok=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1

# 参数说明:
# retry=3          # 重试次数
# minlen=8         # 最小长度8位
# ucredit=-1       # 至少1个大写字母
# lcredit=-1       # 至少1个小写字母
# dcredit=-1       # 至少1个数字
# ocredit=-1       # 至少1个特殊字符

# 禁止使用历史密码
vim /etc/pam.d/system-auth

# 添加
password sufficient pam_unix.so remember=5 use_authtok md5 shadow

# 强制用户下次登录修改密码
chage -d 0 username

# 查看密码状态
passwd -S username
1.3 命令历史限制

bash

复制代码
# 查看当前history设置
echo $HISTSIZE
echo $HISTFILESIZE
echo $HISTFILE

# 永久修改历史记录大小
vim /etc/profile

# 添加或修改
HISTSIZE=1000        # 内存中记录1000条
HISTFILESIZE=2000    # 历史文件中保存2000条
HISTTIMEFORMAT="%F %T "  # 记录时间戳
HISTCONTROL=ignoredups   # 忽略重复命令

# 使配置生效
source /etc/profile

# 清除历史记录
history -c           # 清除当前会话历史
> ~/.bash_history    # 清空历史文件

# 登录时自动清空历史
vim ~/.bash_logout
echo "history -c" >> ~/.bash_logout

# 设置命令历史附加而非覆盖
shopt -s histappend

# 查看带时间戳的历史
history
1.4 自动注销

bash

复制代码
# 设置TMOUT自动注销(秒)
export TMOUT=600    # 10分钟无操作自动注销

# 永久设置
vim /etc/profile
export TMOUT=600

# 或针对特定用户
vim ~/.bash_profile
export TMOUT=300    # 5分钟

# 设置SSH超时
vim /etc/ssh/sshd_config

# 添加或修改
ClientAliveInterval 300      # 300秒发送一次心跳
ClientAliveCountMax 2        # 最多2次无响应断开
# 效果:300 * 2 = 600秒无响应断开

# 重启SSH服务
systemctl restart sshd

# 设置终端空闲超时
vim /etc/profile
export TMOUT=600
readonly TMOUT      # 设置为只读,防止用户修改

# 针对tty终端设置
vim /etc/issue
echo "自动注销时间为600秒" >> /etc/issue

2. 用户切换与提权

2.1 su命令的使用

bash

复制代码
# su命令基本用法
su                 # 切换到root,但环境变量不变
su -               # 切换到root,且使用root的环境变量
su - username      # 切换到指定用户

# su选项说明
-c                 # 执行完命令后恢复原用户
-m, -p             # 保持环境变量不变
-l                 # 相当于"su -"

# 示例
su -c "ls -l /root"  # 以root身份执行命令后返回
su -c "useradd test" -  # 创建用户

# 查看当前用户
whoami
id

# 返回原用户
exit
Ctrl+D

# 限制su命令的使用
# 查看su命令权限
ls -l /bin/su

# su命令的PAM配置文件
vim /etc/pam.d/su

# 允许wheel组用户使用su
auth required pam_wheel.so use_uid

# 添加用户到wheel组
gpasswd -a username wheel
usermod -aG wheel username

# 查看wheel组成员
grep wheel /etc/group

# 禁止普通用户使用su
# 修改su权限
chmod 750 /bin/su
chown root:wheel /bin/su
2.2 限制su命令

bash

复制代码
# 1. 创建wheel组(如果不存在)
groupadd wheel

# 2. 修改su的PAM配置
vim /etc/pam.d/su

# 取消以下行的注释(或在开头添加)
auth required pam_wheel.so use_uid

# 3. 将允许使用su的用户添加到wheel组
usermod -aG wheel alice
usermod -aG wheel bob

# 4. 验证配置
# 查看wheel组成员
getent group wheel

# 5. 测试
# 非wheel组用户尝试su -
# 应该会失败:密码错误或权限拒绝

# 记录su使用日志
# su命令的使用记录在/var/log/secure
tail -f /var/log/secure | grep su

# 示例日志条目
# Jan 15 10:30:45 localhost su: pam_unix(su-l:session): session opened for user root by alice(uid=1000)
2.3 sudo命令的基本使用

bash

复制代码
# sudo基本语法
sudo -u username command    # 以指定用户执行命令
sudo command                 # 以root执行命令
sudo -l                      # 查看当前用户可执行的sudo命令

# sudo选项
sudo -k                      # 强制下次需要密码
sudo -s                      # 启动shell
sudo -i                      # 登录shell(类似su -)
sudo -v                      # 更新时间戳

# 查看sudo版本
sudo -V

# 示例:常用sudo命令
sudo whoami                  # 显示root
sudo -u apache whoami        # 显示apache
sudo tail -f /var/log/messages
sudo systemctl restart httpd
sudo visudo                  # 编辑sudoers文件
2.4 配置sudo权限

bash

复制代码
# sudoers配置文件
/etc/sudoers                 # 主配置文件
/etc/sudoers.d/              # 配置片段目录

# 使用visudo编辑(推荐)
visudo
visudo -f /etc/sudoers.d/custom

# sudoers文件格式
# 用户/组 主机=(用户:组) 命令

# 基本语法示例
root    ALL=(ALL)       ALL                    # root可以执行任何命令
%wheel  ALL=(ALL)       ALL                    # wheel组可以执行任何命令
alice   ALL=(ALL)       ALL                    # alice可以执行任何命令

# 指定命令示例
bob     ALL=/sbin/ifconfig, /bin/systemctl     # bob只能执行这两个命令
%admin  ALL=/usr/bin/yum, /bin/rpm             # admin组可以执行yum和rpm

# 免密码执行
charlie ALL=(ALL) NOPASSWD: ALL                 # charlie无需密码执行所有命令
%wheel  ALL=(ALL) NOPASSWD: /bin/systemctl      # wheel组免密码执行systemctl

# 限制主机来源
dave    webserver=(ALL) ALL                     # dave只能在webserver上执行sudo

# 指定目标用户
jenny   ALL=(apache) ALL                         # jenny只能以apache用户执行命令
%dbadmin ALL=(postgresql) /usr/bin/psql          # dbadmin组只能以postgresql用户执行psql

# 命令别名
Cmnd_Alias NETWORKING = /sbin/ifconfig, /sbin/route, /bin/ping
Cmnd_Alias SERVICES = /bin/systemctl, /sbin/service
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum

%ops ALL=NETWORKING, SERVICES                    # ops组可以执行网络和服务命令
2.5 sudo配置示例

bash

复制代码
#!/bin/bash
# sudo配置示例

# 1. 创建管理员组
groupadd admins
groupadd dbadmins
groupadd webadmins

# 2. 添加用户到组
usermod -aG admins alice
usermod -aG dbadmins bob
usermod -aG webadmins charlie

# 3. 配置sudo权限
cat > /etc/sudoers.d/admins << EOF
# 管理员配置

# 定义命令别名
Cmnd_Alias NETWORK = /sbin/ip, /sbin/ifconfig, /bin/ping, /sbin/route
Cmnd_Alias SERVICE = /bin/systemctl, /sbin/service
Cmnd_Alias PKGMGR = /bin/rpm, /usr/bin/yum, /usr/bin/dnf
Cmnd_Alias DISK = /sbin/fdisk, /sbin/parted, /bin/mount, /bin/umount
Cmnd_Alias LOGS = /bin/journalctl, /bin/cat /var/log/*, /bin/tail -f /var/log/*

# 完全管理员权限
%admins ALL=(ALL) ALL

# 数据库管理员
%dbadmins ALL=(postgresql) /usr/bin/psql, /usr/bin/pg_dump, /usr/bin/pg_restore
%dbadmins ALL=(mysql) /usr/bin/mysql, /usr/bin/mysqldump

# Web管理员
%webadmins ALL=(apache) /bin/systemctl restart httpd, /bin/systemctl reload httpd
%webadmins ALL=(nginx) /bin/systemctl restart nginx, /bin/systemctl reload nginx
%webadmins ALL=(ALL) NOPASSWD: /bin/systemctl status httpd, /bin/systemctl status nginx

# 网络管理员(免密码)
%netadmins ALL=(ALL) NOPASSWD: NETWORK

# 特定用户权限
dave ALL=/usr/bin/vim /etc/httpd/conf/httpd.conf
dave ALL=/usr/bin/systemctl reload httpd

# 日志查看
%ops ALL=NOPASSWD: LOGS
EOF

# 4. 验证sudo权限
visudo -c

# 5. 测试sudo配置
sudo -l -U alice
sudo -l -U bob
2.6 sudo日志和审计

bash

复制代码
# sudo日志配置
vim /etc/sudoers

# 添加日志配置
Defaults logfile=/var/log/sudo.log
Defaults loglinelen=80
Defaults !syslog

# 记录详细日志
Defaults log_output
Defaults!/usr/bin/less log_output

# 查看sudo日志
tail -f /var/log/sudo.log

# 示例sudo日志条目
# Jan 15 10:35:22 : alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/bin/systemctl restart httpd

# 邮件通知
Defaults mail_always
Defaults mailto=admin@example.com
Defaults mail_badpass

# 时间戳超时(默认15分钟)
Defaults timestamp_timeout=5    # 5分钟
Defaults timestamp_timeout=0     # 每次都要求密码

3. 用户切换与提权总结

命令 特点 适用场景 安全建议
su 切换用户,需要目标用户密码 临时切换到其他用户 限制wheel组使用
su - 切换用户并加载环境变量 需要完整用户环境 记录su使用日志
sudo 提权执行命令,需要自己密码 授权特定命令给用户 最小权限原则

二、系统引导和登录控制

1. 开关机安全控制

1.1 限制重启和关机

bash

复制代码
# 查看关机命令权限
ls -l /sbin/shutdown
ls -l /sbin/reboot
ls -l /sbin/halt
ls -l /sbin/poweroff

# 限制普通用户关机
chmod 750 /sbin/shutdown
chmod 750 /sbin/reboot
chown root:wheel /sbin/shutdown

# 通过sudo控制关机权限
visudo

# 允许特定用户关机
%wheel ALL=/sbin/shutdown, /sbin/reboot, /sbin/halt, /sbin/poweroff

# 允许特定用户免密码关机
alice ALL=NOPASSWD: /sbin/shutdown -h now

# 设置Ctrl+Alt+Del禁用
systemctl mask ctrl-alt-del.target
systemctl disable ctrl-alt-del.target

# 或者修改配置
vim /etc/systemd/system/ctrl-alt-del.target
# 注释或修改内容

# 查看当前电源管理
systemctl status poweroff.target
systemctl status reboot.target

# 启用ACPI电源管理
systemctl enable acpid
systemctl start acpid
1.2 GRUB引导安全

bash

复制代码
# GRUB2配置文件
/boot/grub2/grub.cfg      # 主配置文件(不要直接编辑)
/etc/default/grub          # 修改GRUB参数
/etc/grub.d/               # GRUB配置片段

# 设置GRUB密码
vim /etc/grub.d/40_custom

# 添加以下内容
cat << EOF
set superusers="admin"
password_pbkdf2 admin grub.pbkdf2.sha512.10000.加密密码
EOF

# 生成加密密码
grub2-mkpasswd-pbkdf2
# 输入密码后生成加密字符串

# 示例输出
# PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.9C8A9D...

# 复制生成的加密字符串到配置文件

# 更新GRUB配置
grub2-mkconfig -o /boot/grub2/grub.cfg

# 验证配置
grep superusers /boot/grub2/grub.cfg

# 单用户模式加密
vim /etc/default/grub
# 添加
GRUB_2_WAY_RECOVERY="true"

# 禁止交互式启动
GRUB_DISABLE_RECOVERY="true"

# 更新配置
grub2-mkconfig -o /boot/grub2/grub.cfg
1.3 BIOS/UEFI安全

bash

复制代码
# BIOS安全建议
1. 设置BIOS密码
2. 禁用从外部设备启动
3. 启用Secure Boot(UEFI)
4. 设置启动顺序为硬盘优先

# 检查Secure Boot状态
mokutil --sb-state

# 查看UEFI启动项
efibootmgr
efibootmgr -v

# 修改启动顺序
efibootmgr -o 0001,0002

# 删除启动项
efibootmgr -b 0003 -B

2. 终端及登录控制

2.1 禁止root用户登录

bash

复制代码
# 1. 修改SSH配置禁止root登录
vim /etc/ssh/sshd_config

# 修改或添加
PermitRootLogin no
# PermitRootLogin prohibit-password  # 禁止密码登录,允许密钥

# 重启SSH服务
systemctl restart sshd

# 2. 禁止本地终端root登录
# 编辑/etc/securetty
vim /etc/securetty

# 注释所有tty
# console
# tty1
# tty2
# ...

# 清空文件
> /etc/securetty

# 3. 只允许特定终端root登录
echo "tty1" > /etc/securetty
echo "tty2" >> /etc/securetty

# 4. 使用pam限制
vim /etc/pam.d/login

# 添加
auth required pam_securetty.so
2.2 限制登录终端

bash

复制代码
# 查看所有终端
ls /dev/tty*

# 限制用户登录终端
vim /etc/security/access.conf

# 语法:权限:用户:来源
# 示例
+ : root : LOCAL                      # root只能从本地登录
+ : alice : 192.168.1.0/24            # alice只能从内网登录
- : ALL : ALL                          # 其他全部禁止

# 启用access.conf
vim /etc/pam.d/login
# 添加
account required pam_access.so

# 限制用户只能从特定终端登录
vim /etc/security/access.conf
+ : alice : tty1 tty2                   # alice只能从tty1,tty2登录
+ : bob : pts/0                         # bob只能从pts/0登录
- : alice : ALL
- : bob : ALL

# 限制root登录终端
+ : root : tty1                          # root只能从tty1登录
- : root : ALL
2.3 登录超时设置

bash

复制代码
# 系统级超时设置
vim /etc/profile

# 添加
TMOUT=300          # 5分钟
readonly TMOUT     # 只读,防止用户修改
export TMOUT

# 用户级超时设置
vim ~/.bashrc
export TMOUT=600   # 10分钟

# SSH超时设置
vim /etc/ssh/sshd_config

# 客户端无响应超时
ClientAliveInterval 300     # 5分钟
ClientAliveCountMax 2       # 最多2次

# 登录会话超时
LoginGraceTime 60           # 登录宽限期60秒
MaxAuthTries 3              # 最大认证尝试次数

# 重启SSH服务
systemctl restart sshd
2.4 登录限制和黑名单

bash

复制代码
# /etc/security/limits.conf 限制用户资源
vim /etc/security/limits.conf

# 语法:<domain> <type> <item> <value>
# 示例
*               soft    core            0
*               hard    rss             10000
@student        hard    nproc           20
@faculty        soft    nproc           20
alice           hard    nofile          4096
bob             soft    nofile          1024

# 解释:
# soft: 软限制(警告)
# hard: 硬限制(最大)
# nproc: 进程数
# nofile: 打开文件数
# as: 地址空间限制

# 查看用户限制
ulimit -a
ulimit -n        # 查看文件描述符限制

# 登录失败锁定(pam_tally2)
vim /etc/pam.d/system-auth

# 添加
auth        required      pam_tally2.so deny=3 unlock_time=300 even_deny_root root_unlock_time=600

# 参数说明:
# deny=3: 3次失败锁定
# unlock_time=300: 锁定300秒
# even_deny_root: 也锁定root
# root_unlock_time=600: root锁定600秒

# 查看失败计数
pam_tally2 --user username

# 重置计数
pam_tally2 --user username --reset

# 使用faillock(RHEL/CentOS 8+)
vim /etc/security/faillock.conf

# 设置
deny = 3
unlock_time = 300
even_deny_root

# 查看失败登录
faillock
faillock --user username

# 重置
faillock --user username --reset
2.5 登录提示信息

bash

复制代码
# 本地登录提示
vim /etc/issue
# 添加警告信息
########################################
#   未经授权禁止访问本系统!           #
#   所有操作将被记录审计!              #
########################################

# 网络登录提示
vim /etc/issue.net
# 添加警告信息
########################################
#   警告:这是一个受限系统              #
#   所有连接都会被监控和记录             #
########################################

# 配置SSH显示issue.net
vim /etc/ssh/sshd_config
Banner /etc/issue.net

# 重启SSH
systemctl restart sshd

# 登录后提示(motd)
vim /etc/motd
# 添加欢迎信息
========================================
欢迎使用Linux服务器
系统版本:CentOS Linux 7
请遵守公司安全政策
========================================

# 动态motd
vim /etc/profile.d/motd.sh
#!/bin/bash
echo "当前登录用户数: $(who | wc -l)"
echo "系统负载: $(uptime | awk -F'load average:' '{print $2}')"
2.6 登录日志审计

bash

复制代码
# 查看登录日志
tail -f /var/log/secure          # 认证日志
tail -f /var/log/messages         # 系统日志
tail -f /var/log/wtmp              # 登录记录
tail -f /var/log/btmp              # 失败登录记录

# 使用last查看登录历史
last                               # 所有登录记录
last -n 10                         # 最近10条
last username                      # 指定用户
last reboot                        # 重启记录

# 使用lastb查看失败登录
lastb
lastb -n 10

# 使用who查看当前登录
who
who -u
who -H

# 使用w查看详细信息
w
w username

# 使用logwatch分析日志
yum install logwatch
logwatch --detail High --mailto admin@example.com --service sshd

# 自定义登录监控脚本
#!/bin/bash
# login_monitor.sh

LAST_LOGIN=$(last -n 1 | head -1)
FAILED_LOGINS=$(lastb -n 5 2>/dev/null)

echo "最近登录: $LAST_LOGIN"
echo "最近失败登录:"
echo "$FAILED_LOGINS"

# 如果失败登录过多,发送告警
FAIL_COUNT=$(lastb | wc -l)
if [ $FAIL_COUNT -gt 100 ]; then
    echo "警告:失败登录次数过多!" | mail -s "Security Alert" admin@example.com
fi

三、弱口令检测与端口扫描

1. 弱口令检测

1.1 John the Ripper

bash

复制代码
# 安装John the Ripper
# CentOS/RHEL
yum install john

# Ubuntu/Debian
apt install john

# 或者源码编译
wget https://www.openwall.com/john/k/john-1.9.0.tar.gz
tar xzf john-1.9.0.tar.gz
cd john-1.9.0/src
make clean linux-x86-64
make install

# John基本用法
# 1. 准备密码文件
unshadow /etc/passwd /etc/shadow > mypasswd

# 2. 运行John
john mypasswd

# 3. 查看结果
john --show mypasswd

# 4. 使用字典攻击
john --wordlist=/usr/share/wordlists/rockyou.txt mypasswd

# 5. 指定格式
john --format=md5 mypasswd

# 6. 增量模式(暴力破解)
john --incremental mypasswd

# 7. 恢复会话
john --restore

# 8. 查看进度
john --status
1.2 Hydra

bash

复制代码
# 安装Hydra
yum install hydra
apt install hydra

# Hydra基本语法
hydra -l username -P password.txt target service

# SSH密码破解
hydra -l root -P /usr/share/wordlists/rockyou.txt 192.168.1.100 ssh

# FTP密码破解
hydra -l ftpuser -P password.txt ftp://192.168.1.100

# Web表单破解
hydra -l admin -P password.txt 192.168.1.100 http-post-form "/login.php:user=^USER^&pass=^PASS^:F=incorrect"

# 使用用户名字典
hydra -L users.txt -P passwords.txt ssh://192.168.1.100

# 指定端口
hydra -s 2222 -l root -P pass.txt 192.168.1.100 ssh

# 多线程
hydra -t 4 -l root -P pass.txt 192.168.1.100 ssh

# 输出结果
hydra -l root -P pass.txt -o result.txt 192.168.1.100 ssh

# 破解MySQL
hydra -l root -P pass.txt mysql://192.168.1.100
1.3 密码强度检测脚本

bash

复制代码
#!/bin/bash
# password_check.sh - 密码强度检测脚本

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

check_password() {
    local password=$1
    local score=0
    
    echo -e "${YELLOW}检查密码: $password${NC}"
    
    # 检查长度
    if [ ${#password} -ge 8 ]; then
        echo -e "${GREEN}✓ 长度足够 (>=8)${NC}"
        ((score+=1))
    else
        echo -e "${RED}✗ 长度不足 (<8)${NC}"
    fi
    
    # 检查大写字母
    if [[ "$password" =~ [A-Z] ]]; then
        echo -e "${GREEN}✓ 包含大写字母${NC}"
        ((score+=1))
    else
        echo -e "${RED}✗ 缺少大写字母${NC}"
    fi
    
    # 检查小写字母
    if [[ "$password" =~ [a-z] ]]; then
        echo -e "${GREEN}✓ 包含小写字母${NC}"
        ((score+=1))
    else
        echo -e "${RED}✗ 缺少小写字母${NC}"
    fi
    
    # 检查数字
    if [[ "$password" =~ [0-9] ]]; then
        echo -e "${GREEN}✓ 包含数字${NC}"
        ((score+=1))
    else
        echo -e "${RED}✗ 缺少数字${NC}"
    fi
    
    # 检查特殊字符
    if [[ "$password" =~ [^a-zA-Z0-9] ]]; then
        echo -e "${GREEN}✓ 包含特殊字符${NC}"
        ((score+=1))
    else
        echo -e "${RED}✗ 缺少特殊字符${NC}"
    fi
    
    # 评分
    echo -e "\n${YELLOW}密码强度评分: $score/5${NC}"
    case $score in
        5) echo -e "${GREEN}强度: 很强${NC}" ;;
        4) echo -e "${GREEN}强度: 强${NC}" ;;
        3) echo -e "${YELLOW}强度: 中等${NC}" ;;
        2) echo -e "${RED}强度: 弱${NC}" ;;
        *) echo -e "${RED}强度: 很弱${NC}" ;;
    esac
}

# 批量检查用户密码
check_all_users() {
    echo "检查所有用户的密码强度..."
    
    for user in $(awk -F: '$3>=1000 {print $1}' /etc/passwd); do
        echo -e "\n${YELLOW}用户: $user${NC}"
        # 这里需要实际的密码,示例仅演示
        # 实际中不能直接获取密码hash
    done
}

# 主菜单
while true; do
    echo "1. 检查单个密码"
    echo "2. 检查所有用户"
    echo "3. 退出"
    read -p "选择操作: " choice
    
    case $choice in
        1)
            read -sp "输入密码: " pass
            echo
            check_password "$pass"
            ;;
        2)
            check_all_users
            ;;
        3)
            exit 0
            ;;
    esac
done
1.4 密码字典生成

bash

复制代码
#!/bin/bash
# wordlist_generator.sh - 密码字典生成器

# Crunch工具(需要安装)
# apt install crunch
# yum install crunch

# 基本用法
crunch 6 8 0123456789 -o 6-8-digit.txt
crunch 8 8 abcdefghijklmnopqrstuvwxyz -o 8alpha.txt

# 组合模式
crunch 8 8 -t @@2019@@ -p abcdefgh

# 使用字符集
crunch 8 8 -f /usr/share/crunch/charset.lst mixalpha -o wordlist.txt

# Python密码字典生成器
cat > generate_wordlist.py << 'EOF'
#!/usr/bin/env python3
import itertools
import string

def generate_wordlist():
    """生成密码字典"""
    
    # 基础字典
    base_words = ['password', 'admin', 'root', 'user', 'test', '123456', 
                  'qwerty', 'abc123', 'welcome', 'passw0rd']
    
    # 常见替换规则
    leet_map = {'a': '@', 'e': '3', 'i': '1', 'o': '0', 's': '$'}
    
    # 生成年份组合
    years = [str(y) for y in range(1970, 2025)]
    
    with open('mylist.txt', 'w') as f:
        # 基础单词
        for word in base_words:
            f.write(word + '\n')
            f.write(word.capitalize() + '\n')
            f.write(word.upper() + '\n')
            
            # leet替换
            leet_word = ''
            for c in word:
                leet_word += leet_map.get(c, c)
            f.write(leet_word + '\n')
        
        # 单词+年份
        for word in base_words:
            for year in years:
                f.write(f"{word}{year}\n")
        
        # 纯数字
        for i in range(1000000):
            f.write(f"{i:06d}\n")
            if i > 100000:  # 限制数量
                break

if __name__ == "__main__":
    generate_wordlist()
    print("字典生成完成: mylist.txt")
EOF

chmod +x generate_wordlist.py
python3 generate_wordlist.py

2. 网络扫描

2.1 Nmap基本使用

bash

复制代码
# 安装nmap
yum install nmap
apt install nmap

# nmap基本语法
nmap [扫描类型] [选项] 目标

# 1. 基础扫描
nmap 192.168.1.1
nmap scanme.nmap.org

# 2. 扫描网段
nmap 192.168.1.0/24
nmap 192.168.1.1-100

# 3. 扫描多个目标
nmap 192.168.1.1 192.168.1.2 192.168.1.3
nmap 192.168.1.1-10

# 4. 从文件读取目标
nmap -iL targets.txt

# 5. 排除目标
nmap 192.168.1.0/24 --exclude 192.168.1.100
2.2 Nmap扫描类型

bash

复制代码
# 1. TCP SYN扫描(半开放扫描,默认)
nmap -sS 192.168.1.1

# 2. TCP Connect扫描
nmap -sT 192.168.1.1

# 3. UDP扫描
nmap -sU 192.168.1.1

# 4. FIN扫描
nmap -sF 192.168.1.1

# 5. Ping扫描
nmap -sP 192.168.1.0/24

# 6. 版本检测
nmap -sV 192.168.1.1

# 7. 操作系统检测
nmap -O 192.168.1.1

# 8. 综合扫描
nmap -A 192.168.1.1
2.3 Nmap端口和选项

bash

复制代码
# 指定端口
nmap -p 80 192.168.1.1
nmap -p 1-1000 192.168.1.1
nmap -p 22,80,443 192.168.1.1
nmap -p- 192.168.1.1          # 所有端口

# 常用服务端口
nmap -p 21,22,23,25,80,443,3306,3389 192.168.1.1

# 快速扫描
nmap -F 192.168.1.1            # 扫描100个常用端口

# 时序选项(速度)
nmap -T0 192.168.1.1           # 极慢(IDS逃避)
nmap -T1 192.168.1.1           # 慢
nmap -T2 192.168.1.1           # 较慢
nmap -T3 192.168.1.1           # 普通(默认)
nmap -T4 192.168.1.1           # 快速
nmap -T5 192.168.1.1           # 极快

# 输出格式
nmap -oN scan.txt 192.168.1.1           # 普通格式
nmap -oX scan.xml 192.168.1.1           # XML格式
nmap -oG scan.grep 192.168.1.1          # grepable格式
nmap -oA scan 192.168.1.1               # 所有格式

# 详细输出
nmap -v 192.168.1.1
nmap -vv 192.168.1.1

# 网卡和路由
nmap -e eth0 192.168.1.1
nmap --iflist                   # 列出网络接口
2.4 Nmap脚本引擎

bash

复制代码
# Nmap脚本引擎(NSE)
# 脚本位置:/usr/share/nmap/scripts/

# 列出所有脚本
ls /usr/share/nmap/scripts/
nmap --script-help all | less

# 使用特定脚本
nmap --script=http-title 192.168.1.1
nmap --script=smb-os-discovery 192.168.1.1
nmap --script=vuln 192.168.1.1          # 漏洞扫描

# 使用脚本类别
nmap --script=default 192.168.1.1       # 默认脚本
nmap --script=safe 192.168.1.1          # 安全脚本
nmap --script=discovery 192.168.1.1     # 发现脚本
nmap --script=auth 192.168.1.1          # 认证脚本
nmap --script=brute 192.168.1.1         # 暴力破解
nmap --script=exploit 192.168.1.1       # 漏洞利用

# 组合脚本
nmap --script=default,safe 192.168.1.1
nmap --script="http-*" 192.168.1.1      # HTTP相关脚本

# 带参数的脚本
nmap --script=http-enum --script-args http-enum.fingerprintfile=./file.txt 192.168.1.1

# 脚本更新
nmap --script-updatedb

# 常用脚本示例
# Web扫描
nmap -sV --script=http-enum,http-headers,http-title 192.168.1.1

# SMB扫描
nmap -p 445 --script=smb-enum-shares,smb-os-discovery 192.168.1.1

# DNS扫描
nmap -p 53 --script=dns-brute --script-args dns-brute.hostlist=hosts.txt example.com

# MySQL扫描
nmap -p 3306 --script=mysql-info,mysql-empty-password,mysql-users 192.168.1.1
2.5 Nmap扫描示例

bash

复制代码
#!/bin/bash
# network_scan.sh - 网络扫描脚本

TARGET_NET="192.168.1.0/24"
OUTPUT_DIR="/tmp/nmap_scans"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $OUTPUT_DIR

echo "开始网络扫描: $TARGET_NET"

# 1. 主机发现
echo "1. 发现活动主机..."
nmap -sn $TARGET_NET -oG $OUTPUT_DIR/hosts_$DATE.grep
cat $OUTPUT_DIR/hosts_$DATE.grep | grep Up | cut -d' ' -f2 > $OUTPUT_DIR/live_hosts.txt

echo "发现以下活动主机:"
cat $OUTPUT_DIR/live_hosts.txt

# 2. 对每个主机进行端口扫描
while read host; do
    echo "扫描主机: $host"
    
    # 快速端口扫描
    nmap -F -T4 -sV $host -oN $OUTPUT_DIR/${host}_quick_$DATE.txt
    
    # 操作系统检测
    nmap -O $host -oN $OUTPUT_DIR/${host}_os_$DATE.txt
    
    # 漏洞扫描
    nmap --script=vuln $host -oN $OUTPUT_DIR/${host}_vuln_$DATE.txt
    
done < $OUTPUT_DIR/live_hosts.txt

# 3. 生成报告
echo "生成扫描报告..."
cat > $OUTPUT_DIR/report_$DATE.html << EOF
<html>
<head><title>Nmap扫描报告</title></head>
<body>
<h1>扫描报告 - $DATE</h1>
<h2>活动主机列表</h2>
<pre>
$(cat $OUTPUT_DIR/live_hosts.txt)
</pre>
<h2>详细结果</h2>
EOF

for file in $OUTPUT_DIR/*_quick_*.txt; do
    host=$(basename $file | cut -d'_' -f1)
    echo "<h3>$host</h3>" >> $OUTPUT_DIR/report_$DATE.html
    echo "<pre>" >> $OUTPUT_DIR/report_$DATE.html
    cat $file >> $OUTPUT_DIR/report_$DATE.html
    echo "</pre>" >> $OUTPUT_DIR/report_$DATE.html
done

echo "</body></html>" >> $OUTPUT_DIR/report_$DATE.html

echo "扫描完成!报告位置: $OUTPUT_DIR/report_$DATE.html"
2.6 其他扫描工具

bash

复制代码
# 1. Netcat
# 端口扫描
nc -zv 192.168.1.1 1-1000
nc -zv 192.168.1.1 22

# 2. hping3
# SYN扫描
hping3 -S -p 80 -c 1 192.168.1.1

# 3. Masscan(极速扫描)
masscan -p80,443 192.168.1.0/24 --rate=10000

# 4. Unicornscan
unicornscan -i eth0 192.168.1.1

# 5. Zenmap(nmap GUI)
zenmap

# 6. 简单端口扫描脚本
#!/bin/bash
# simple_port_scanner.sh

HOST=$1
START_PORT=$2
END_PORT=$3

for port in $(seq $START_PORT $END_PORT); do
    timeout 1 bash -c "echo >/dev/tcp/$HOST/$port" 2>/dev/null
    if [ $? -eq 0 ]; then
        echo "端口 $port 开放"
    fi
done
2.7 安全加固建议

bash

复制代码
#!/bin/bash
# security_hardening.sh - 基于扫描结果的安全加固

# 1. 关闭不必要的端口和服务
echo "检查并关闭不必要的服务..."

# 获取当前开放端口
OPEN_PORTS=$(netstat -tuln | grep LISTEN | awk '{print $4}' | cut -d':' -f2 | sort -u)

# 允许的端口(根据需求修改)
ALLOWED_PORTS="22 80 443"

for port in $OPEN_PORTS; do
    if [[ ! "$ALLOWED_PORTS" =~ "$port" ]]; then
        echo "警告: 发现非必要开放端口: $port"
        # 查找使用该端口的服务
        SERVICE=$(lsof -i:$port | grep LISTEN | awk '{print $1}')
        echo "  服务: $SERVICE"
        
        # 停止并禁用服务
        if [ ! -z "$SERVICE" ]; then
            systemctl stop $SERVICE
            systemctl disable $SERVICE
            echo "  已停止服务: $SERVICE"
        fi
    fi
done

# 2. 配置防火墙
echo "配置防火墙规则..."

# 允许必要端口
for port in $ALLOWED_PORTS; do
    firewall-cmd --permanent --add-port=${port}/tcp
done
firewall-cmd --reload

# 3. 强化SSH配置
echo "强化SSH配置..."
cat >> /etc/ssh/sshd_config << EOF

# 安全加固配置
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
Protocol 2
EOF

systemctl restart sshd

# 4. 配置fail2ban
yum install fail2ban
cat > /etc/fail2ban/jail.local << EOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
EOF

systemctl start fail2ban
systemctl enable fail2ban

# 5. 定期扫描计划
cat > /etc/cron.daily/security_scan << 'EOF'
#!/bin/bash
# 每日安全扫描

DATE=$(date +%Y%m%d)
LOG_DIR=/var/log/security_scans
mkdir -p $LOG_DIR

# 扫描开放端口
nmap -sT localhost > $LOG_DIR/open_ports_$DATE.txt

# 检查新开放端口
if [ -f $LOG_DIR/open_ports_yesterday.txt ]; then
    diff $LOG_DIR/open_ports_$DATE.txt $LOG_DIR/open_ports_yesterday.txt > $LOG_DIR/port_changes_$DATE.txt
fi

cp $LOG_DIR/open_ports_$DATE.txt $LOG_DIR/open_ports_yesterday.txt
EOF

chmod +x /etc/cron.daily/security_scan

echo "安全加固完成!"
相关推荐
WangJunXiang62 小时前
系统安全及应用
安全·github·系统安全
ego.iblacat2 小时前
Linux 系统安全及应用
linux·运维·系统安全
卢傢蕊2 小时前
Linux系统安全
linux·运维·系统安全
|华|2 小时前
系统安全及应用
安全·系统安全
m0_738120722 小时前
网络安全编程——PHP基础Cookie详细讲解
后端·安全·web安全·前端框架·php
IPDEEP全球代理2 小时前
静态住宅IP安全吗?
网络协议·tcp/ip·安全
星幻元宇VR2 小时前
VR生产安全学习机|开启智慧安全培训新时代
人工智能·科技·学习·安全·vr
星幻元宇VR2 小时前
VR科普学习一体机,在学校教育的应用前景
科技·学习·安全·vr·虚拟现实
于先生吖2 小时前
从源码到上线:Java 游戏陪玩系统的性能优化与安全加固
安全·游戏