【转载】Linux安全相关专栏

【转载】Linux安全相关专栏

vate_room 35 2023-08-28

文字转自xaoc的学习笔记,感谢大佬的分享

fail2ban

参考:

如何在 Ubuntu 20.04 上使用 Fail2Ban 保护 Nginx 服务器

正确的 fail2ban 配置

注意:

ssh ban ip 是统计一段时间内的错误次数,登录成功不会刷新累计的错误次数

安装

$ sudo apt install fail2ban

# apt 库里的不是最新,可以去 https://github.com/fail2ban/fail2ban/releases 下载最新版 deb 升级成最新版
$ sudo apt install ./fail2ban_1.0.2-1.upstream1_all.deb

配置

$ sudo vim /etc/fail2ban/jail.conf

[DEFAULT]
bantime  = -1 # 永久 ban
findtime = 1d # 错误次数保留一天
maxretry = 3  # 最多3次错误

[sshd]
enabled = true
#可选项,可以改成激进模式
mode = aggressive

启动 fail2ban

$ sudo systemctl enable fail2ban
$ sudo systemctl start fail2ban
$ sudo systemctl status fail2ban

检查状态

$ sudo fail2ban-client ping
$ sudo fail2ban-client status  # 总的
$ sudo fail2ban-client status sshd  # 详细

解除被 ban 的 IP地址

$ sudo fail2ban-client set sshd unbanip 192.168.1.8
$ sudo fail2ban-client set sshd unbanip --all

联合 ufw ban 掉扫描器

https://github.com/asifbacchus/fail2banUFW

https://git.asifbacchus.dev/asif/fail2banUFW/wiki

  1. jail.local 修改

    bantime = 1w  # 一周
    findtime = 1d  # 一天
    action = %(action_)s
    
  2. 将 action.d 下的 ufw.conf 替换成原来的,并将 blocktype = reject 改为 blocktype = deny

  3. 更改 jail.d 下的 ssh.conf 的端口号

  4. 更改 jail.d 下 recidivist.conf, ufw-probe.conf 里的 maxretry, findtime, bantime 为合适的值

    # 激进策略,访问一次未开放的端口就 ban ip 一周,两周内再次访问未开放端口 ban 永久
    
    # recidivist.conf
    maxretry    = 1
    findtime    = 2w
    bantime     = -1
    
    # ufw-probe.conf
    maxretry    = 1
    findtime    = 5m  # 5分钟
    bantime     = 1w
    
  5. 重启服务 sudo systemctl restart fail2ban

ufw

记录

查看 ufw 状态

$ sudo ufw status verbose

重置所有 ufw 规则

$ sudo ufw reset

开启 ufw

# 同时会启动服务,开机自启 ufw
# 开启后不会断掉当前连接,请及时添加 ssh 端口,以免把自己锁在门外
$ sudo ufw enable

添加规则

$ sudo ufw allow 22
$ sudo ufw allow 22/tcp

删除规则

$ sudo ufw delete allow 22

查看日志

# /var/log/ufw.log

IN=此字段显示传入流量的设备。
OUT=此字段显示传出流量的设备。
MAC=此字段显示设备的 MAC 地址。
SRC=此字段显示连接源 IP 地址。
DST=显示连接的目标 IP 地址。
LEN=该字段显示数据包的长度。
TOS= (Type of Service) 此字段用于数据包分类,已弃用。
PREC=该字段显示服务的优先类型。
TTL= 此字段显示生存时间。
ID=此字段显示 IP 数据报的唯一 ID,由同一数据包的片段共享。
PROTO= 此字段显示使用的协议。
SPT 是源端口,DPT 是目标端口

reject 和 deny 区别

  • ufw reject out smtp # 禁止访问外部smtp端口,不告知“被防火墙阻止”
  • ufw deny out to 192.168.1.1 # deny,客户端只能最终请求超时。无任何返回。

goaccess

官方文档

https://goaccess.io/man

命令

生成静态 HTML

$ sudo goaccess access.log --log-format=COMBINED -o report.html

生成实时 HTML 输出

$ sudo goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html

ssh 解析服务器上的 log

不好用

$ ssh -n root@server 'tail -f /var/log/nginx/access.log' | goaccess - --log-format=COMBINED -o report.html

netdata状态监控

安装

参见 https://learn.netdata.cloud/docs/get-started

一行脚本安装,可以把每夜版换成稳定版

$ wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh && sh /tmp/netdata-kickstart.sh --stable-channel

安装好后默认可以直接通过 ip:19999 访问 web仪表盘

配置

修改监听、默认端口

将默认监听的 * 改为 localhost,将默认的端口 19999 改成其他,这样就只能本机访问,外部无法通过 ip:port 访问

# 官方推荐用 edit-config 编辑配置
$ sudo /etc/netdata/edit-config netdata.conf

# 添加
[web]
    bind to = localhost
    default port = 19191

外部通过 SSH 本地转发的方式访问 e.g.

$ ssh -N -L 19999:127.0.0.1:19999 root@example.com

禁用不需要的插件或收集器

link

如果您知道您不需要整个插件或特定的收集器,您可以禁用它们中的任何一个。请记住,如果插件/收集器无事可做,它只会关闭并且不会消耗系统资源。您只能通过禁用主动收集指标的插件/收集器来提高代理的性能。

降低收集频率(全局)

link

提高代理资源利用率的最快方法是降低它收集指标的频率。

如果您不需要每秒指标,或者如果 Netdata Agent 使用大量 CPU,即使没有人在查看该节点的 仪表板,将代理配置为不太频繁地收集指标。

打开 netdata.conf并编辑 update every环境。 默认是 1,意味着代理收集指标 每一秒。

如果你把这个改成 2, Netdata 强制执行最小值 update every设置为 2 秒,并且每隔 其次,这将有效地将 CPU 利用率减半。 将此设置为 5或者 10每 5 或 10 次收集指标 秒,分别。

[global]
    update every = 5

禁用日志

link

如果您的安装工作正常,并且您没有主动审核 Netdata 的日志,请在 netdata.conf.

[logs]
    debug log = none
    error log = none
    access log = none

通知配置

  1. @BotFather 创建机器人

  2. 在 @BotFather 获取【Bot Token】

  3. @myidbot 获取【用户ID】

  4. 修改配置

    $ sudo /etc/netdata/edit-config health_alarm_notify.conf
    
    # CTRL + W 可以搜索
    # 这个默认就是 YES
    SEND_TELEGRAM="YES"
    # 填入 Bot Token
    TELEGRAM_BOT_TOKEN="111122223:7OpFlFFRzRBbrUUmIjj5HF9Ox2pYJZy5"
    # 填入 用户ID
    DEFAULT_RECIPIENT_TELEGRAM="-100233335555"
    
    # 发送警报测试
    $ /usr/libexec/netdata/plugins.d/alarm-notify.sh test