- server(服务配置)
- 系统优化
- su, sudo
- ssh
- 服务(server)
- 安全(security)
- 以redis为例的服务检查
- ssh
- firejail:安全运行软件
- 重要文件加锁chattr -i
- ntp(同步时间服务)
- 关闭 core dump
- selinux
- tcp_wrappers: 第二层防火墙
- aide:保存当前文件的状态(新增的文件、修改时间、权限、文件哈希值),日后可以对比
- metasploit
- rkhunter: 检查 rookit
- clamav: 病毒扫描
- sqlmap: 自动检测和利用 SQL 注入漏洞,获得数据库服务器的权限。
- ghauri:自动检测和利用 SQL 注入漏洞
- beef: web渗透测试
- lynis(安全审计以及加固工具)
- fscan:开源的内网安全扫描工具提供了一键自动化全方位的漏洞扫描。它使用方便、功能全面,支持端口扫描、常见的服务器爆破、Web 应用漏洞扫描、NetBIOS 嗅探等功能。
- clamav:cisco的反病毒引擎
- gophish:开源的网络钓鱼平台。该项目提供了一个开箱即用的网络钓鱼平台,可用于模拟钓鱼攻击。它拥有友好的 Web 管理后台,支持邮件模板、批量发送邮件、网站克隆和数据可视化,适用于企业安全培训和渗透测试等场景。
- 攻击
- 系统监控
- 自动化任务
- Gitlab-CE
- 日志软件
- 未读
- 方法1: 修改
/etc/fstab
# 在<options>, 加入discard
UUID=3453g54-6628-2346-8123435f /home xfs defaults,discard 0 0
- 方法2: systemctl启动fstrim服务. 如果之前使用了方法1, 记得删除discard
# 每周一0点, 清理一次
systemctl enable fstrim.timer
systemctl start fstrim.timer
-
centos的默认中断分配服务
-
会根据系统的负载情况, 将中断分配到不同的cpu
systemctl status irqbalance
# 删除以下文件
rm /usr/lib/systemd/system/ctrl-alt-del.target
# 重新加载配置文件
init q
/etc/sudoers
# sudo无需输入密码
tz ALL = NOPASSWD: ALL
# sudo cat /etc/shadow 此命令无需输入密码
tz ALL = NOPASSWD: /bin/cat /etc/shadow
-
禁止 wheel 组以外的用户使用
su - root
命令# 在/etc/pam.d/su文件下配置 auth sufficient pam_rootok.so auth required pam_wheel.so group=wheel
-
设置口令最大的出错次数 5 次,系统锁定后的解锁时间为 180 秒: 在
/etc/pam.d/system-auth
和/etc/pam.d/password-auth
文件中添加auth required pam_faillock.so preauth audit silent deny=5 unlock_time=180 auth [success=1 default=bad] pam_unix.so auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=180 auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=180
- 测试
# ssh登陆时输错密码 # 查看锁定 faillock # 解锁用户 faillock --user username --reset
-
修改密码有效期
- 相同的配置下
/etc/shadow
文件的优先级高于/etc/login.defs
参数 内容 建议设置值 PASS_MAX_DAYS 口令最大有效期 90 PASS_MIN_DAYS 两次修改口令的最小间隔时间 10 PASS_WARN_AGE 口令过期前开始提示天数 7 # 在/etc/login.defs文件下修改 # 修改前 PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_MIN_LEN 5 PASS_WARN_AGE 7 # 修改后 PASS_MAX_DAYS 90 PASS_MIN_DAYS 10 PASS_MIN_LEN 5 PASS_WARN_AGE 7
- 相同的配置下
-
设置密码复杂度:
参数 内容 minlen = 8 口令长度至少包含 8 个字符 dcredit = -1 口令包含N个数字 ucredit = -1 口令包含N大写字母 ocredit = -1 口令包含N个特殊字符 lcredit = -1 口令包含N个小写字母 - 在
/etc/pam.d/password-auth
和/etc/pam.d/system-auth
未配置 minlen、dcredit、ucredit、ocredit、lcredit 时,/etc/security/pwquality.conf
文件设置才会生效
cat >>/etc/security/pwquality.conf << EOF minlen = 8 dcredit = -1 ucredit = -1 ocredit = -1 lcredit = -1 EOF
- 在
-
SSH 的三个主要层: 传输层、验证层和连接层
-
传输层
传输层提供加密、完整性和数据保护,确保客户端和服务器之间的通信安全。
-
1.建立 TCP 连接
- 客户端启动与 SSH 服务器的 TCP 连接,通常是在 22 端口。
-
2.协议版本交换
- 客户端和服务器交换包含各自支持的 SSH 协议版本的标识字符串。
-
3.算法协商
- 客户端和服务器就加密、密钥交换、MAC(消息验证码)和压缩所使用的加密算法达成一致。
-
4.密钥交换
- 密钥交换算法(如 Diffie-Hellman)用于安全生成共享秘密。这一过程可确保双方在不直接传输的情况下获得相同的会话密钥。
-
5.会话密钥推导
- 会话密钥是从共享秘密和其他交换信息中推导出来的。这些密钥用于加密和解密通信。
-
6.密码初始化
- 双方使用导出的会话密钥初始化各自选择的加密和 MAC 算法。
-
7.数据完整性和加密
- 传输层为客户端和服务器之间的所有后续通信提供数据完整性检查和加密。
-
-
验证层
验证层验证客户端的身份,确保只有授权用户才能访问服务器。
-
1.服务请求
- 客户端请求 "ssh-userauth "服务。
-
2.身份验证方法广告 服务器公布可用的身份验证方法(如密码、公钥、键盘交互)。
-
3.客户端身份验证
-
客户端尝试使用一种或多种可用方法进行身份验证。常见方法包括:
-
密码验证:客户端向服务器发送密码,由服务器进行验证。
-
公钥验证:客户端证明拥有与先前注册的公钥相对应的私钥。
-
键盘交互式身份验证:服务器向客户端发送提示,客户端回复所需的信息(如 OTP、安全问题)。
-
-
4.身份验证成功/失败
- 如果客户端的凭据有效,服务器将允许访问。否则,客户端可尝试其他认证方法或关闭连接。
-
-
连接层
连接层将加密和认证通信复用为多个逻辑通道。
-
1.创建通道
- 客户端请求为各种类型的通信(如 shell 会话、文件传输、端口转发)打开通道。
-
2.信道请求
- 每个通道请求包括所需服务类型和任何附加参数等详细信息。
-
3.信道数据传输
- 数据通过已建立的信道传输。每个通道独立运行,允许多个服务在一个 SSH 连接上同时运行。
-
4.关闭通道
- 通道可以相互独立关闭,而不会影响整个 SSH 连接。关闭所有通道后,客户端即可终止 SSH 会话。
-
5.全局请求
- 连接层还支持全局请求,全局请求会影响整个连接而不是单个通道(例如,重新加密钥会话)。
-
-
默认为22端口,安全起见可更改为其它端口,如8022
-
参数的优先级是:
命令行配置选项
>~/.ssh/config
>/etc/ssh/ssh_config
-
SSH支持多种身份验证机制,它们的验证顺序如下:gssapi-with-mic,hostbased,publickey,keyboard-interactive,password
-
这些认证顺序可以通过ssh配置文件(注意,不是sshd的配置文件)中的指令PreferredAuthentications改变。
-
但常见的是密码认证机制(password)和公钥认证机制(public key). 当公钥认证机制未通过时,再进行密码认证机制的验证。
-
-
服务器公钥保存路径:
~/.ssh/authorized_keys
- 注意:服务端
authorized_keys
和客户端私钥文件
权限必须是600
- 注意:服务端
-
debug:
# 客户端debug:-vvv参数是debug,把所有流程在控制台显示出来。卡在哪个环节;密码不对还是key不对一看就知道 ssh -vvv centos7 # 服务端debug:看输出信息验证为什么pub key不能login等 /usr/sbin/sshd -ddd -p 2222
-
列出本地所支持默认的加密算法
ssh -Q key ssh -Q cipher # List supported ciphers ssh -Q mac # List supported MACs ssh -Q key # List supported public key types ssh -Q kex # List supported key exchange algorithms
-
公钥、私钥常见扩展名
- 公钥:
.pub
.pem
ca.crt
- 私钥:
.prv
.pem
ca.key
.key
- 公钥:
-
服务器会保存曾经尝试连接(因为要输入密码,未必真的连接成功)的主机记录:
~/.ssh/known_hosts
# 生成公私密钥。-t为rsa算法 -C为注释。
ssh-keygen -t rsa -b 4096 -C "[email protected]"
# 生成公私密钥。github建议使用ed25519算法,openssh9.5开始默认使用ed25519算法
ssh-keygen -t ed25519 -C "[email protected]"
# 执行后。第一次输入需要修改文件名,默认会覆盖id_rsa文件;第二次passphrase为输入密码,就算密钥被盗也没用。
# 添加公钥到远程服务器
ssh user@ip 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
# or 使用ssh-copy-id -i
sudo ssh-copy-id -i ~/.ssh/id_rsa.pub ip
# ssh连接远程服务器
ssh user@ip
# -i 指定私钥路径
ssh -i ~/.ssh/id_rsa user@ip
-
修改
/etc/ssh/sshd_config
配置文件# 允许密钥连接 PubkeyAuthentication yes
-
重启sshd服务
systemctl restart sshd
# 允许密钥连接
PubkeyAuthentication yes
# 允许密码连接
PasswordAuthentication yes
# 允许用户
AllowUsers user1 user2
# 禁止root登陆
PermitRootLogin no
# 修改默认端口
Port 22221
# 不使用dns反查, 提高ssh连接速度
UseDNS no
# Banner指定用户登录后,sshd 向其展示的信息文件(Banner /usr/local/etc/warning.txt),默认不展示任何内容。/etc/ssh/my_banner 中可以放置提示内容
Banner /etc/ssh/my_banner
# 后台启动ssh-agent
eval `ssh-agent -s`
# 添加私钥。需要输入passphrase密码
ssh-add ~/.ssh/id_rsa
# 查看私钥
ssh-add -L
# 关闭ssh-agent。ssh-agent把密码写入内存,可能会有被入侵的风险。
ssh-agent -k
- 配置
~/.ssh/config
文件:
ssh option | 内容 |
---|---|
IdentityFile | 私钥路径 |
Compression | 启动压缩(会对性能产生影响) |
Host centos7
HostName 192.168.100.208
User root
Port 22
IdentityFile ~/.ssh/id_rsa
Compression yes
Host opensuse
HostName 192.168.100.71
User root
Port 22
IdentityFile ~/.ssh/id_rsa
Compression yes
- 配置好后,即可
ssh Host
连接:
ssh centos7
ssh opensuse
-
在ssh配置文件
~/.ssh/config
增加以下参数:意味着72小时内登录同一台跳板机只有第一次需要输入密码,以后都是重用之前的连接,所以也就不再需要输入密码了。#reuse the same connection --关键配置 ControlMaster auto ControlPath /tmp/ssh_mux_%h_%p_%r #查了下ControlPersist是在OpenSSH5.6加入的,5.3还不支持 #不支持的话直接把这行删了,不影响功能 #keep one connection in 72hour ControlPersist 72h #复用连接的配置到这里,后面的配置与复用无关 #其它也很有用的配置 GSSAPIAuthentication=no #这个配置在公网因为安全原因请谨慎关闭 StrictHostKeyChecking=no TCPKeepAlive=yes CheckHostIP=no # "ServerAliveInterval [seconds]" configuration in the SSH configuration so that your ssh client sends a "dummy packet" on a regular interval so that the router thinks that the connection is active even if it's particularly quiet ServerAliveInterval=15 #ServerAliveCountMax=6 ForwardAgent=yes UserKnownHostsFile /dev/null
-
这个就是保存好的socket,下次可以重用,免密码。 in 259200 seconds 对应 72小时
ssh -vvv centos7 OpenSSH_9.6p1, OpenSSL 3.2.1 30 Jan 2024 debug1: Reading configuration data /home/tz/.ssh/config debug1: /home/tz/.ssh/config line 1: Applying options for centos7 debug1: Reading configuration data /etc/ssh/ssh_config debug2: resolve_canonicalize: hostname 192.168.100.208 is address debug1: auto-mux: Trying existing master at '/tmp/ssh_mux_192.168.100.208_22_root' debug2: fd 3 setting O_NONBLOCK debug2: mux_client_hello_exchange: master version 4 debug3: mux_client_forwards: request forwardings: 0 local, 0 remote debug3: mux_client_request_session: entering debug3: mux_client_request_alive: entering debug3: mux_client_request_alive: done pid = 4169 debug3: mux_client_request_session: session request sent debug1: mux_client_request_session: master session id: 2 # 查看文件类型 ls -l /tmp/ssh_mux_192.168.100.208_22_root srw------- 1 - tz tz 27 Mar 16:46 /tmp/ssh_mux_192.168.100.208_22_root=
-
比如有一批客户机房的机器IP都是192.168.., 然后需要走跳板机100.10.1.2才能访问到,那么我希望以后在笔记本上直接 ssh 192.168.1.5 就能直接连上
-
方法1:ProxyCommand
-
/etc/ssh/ssh_config
配置Host 192.168.*.* ProxyCommand ssh -l ali-renxijun -p 8022 100.10.1.2 exec /usr/bin/nc %h %p
-
以上配置等价下面的命令
ssh -o ProxyCommand="ssh -l root -p 8022 100.10.1.2 exec /usr/bin/nc %h %p" 192.168.1.5 # or 等价 ssh -o ProxyCommand="ssh -l root -p 8022 -W %h:%p 100.10.1.2 " 192.168.1.5 # or 等价。ProxyCommand和ProxyJump很类似,ProxyJump使用: ssh -J [email protected]:8022 192.168.1.5
-
-
方法2:ProxyJump
-
OpenSSH 7.3 以上版本才可以使用 ProxyJump, 相对 ProxyCommand 更简洁方便些
-
/etc/ssh/ssh_config
配置Host 192.168.*.* ProxyJump [email protected]:8022
-
- 192.168.100.208为开启了nginx的web服务器
# 映射到本地的8088端口
ssh -CNfL 0.0.0.0:8088:192.168.100.208:80 [email protected]
# 测试是否成功
curl 127.0.0.1:8088
-
连服务器报如下错误:
# 表示服务端支持 diffie-hellman-group1-sha1,diffie-hellman-group14-sha1 加密,但是client端不支持 debug1: kex: algorithm: (no match) Unable to negotiate with server port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1
-
解决方法
ssh -oKexAlgorithms=+diffie-hellman-group14-sha1 -l user
- 或者 ~/.ssh/config 配置
host server_ip KexAlgorithms +diffie-hellman-group1-sha1
-
如果仍然报以下错误:
debug2: first_kex_follows 0 debug2: reserved 0 debug1: kex: algorithm: diffie-hellman-group14-sha1 debug1: kex: host key algorithm: (no match) Unable to negotiate with server_ip port 22: no matching host key type found. Their offer: ssh-rsa
-
那么可以配置来解决:
Host * HostKeyAlgorithms +ssh-rsa PubkeyAcceptedKeyTypes +ssh-rsa
-
三个转发模式的比较:
-
动态转发(socks5代理):完全可以代替本地转发,只是动态转发是socks5协议,当科学上网用,本地转发是tcp协议
-
本地转发(正向代理):完全是把动态转发特例化到访问某个固定目标的转发,类似 iptable 的 port forwarding
-
远程转发(反向代理):是启动转端口的机器同时连上两端的两个机器,把本来不连通的两端拼接起来,中间显得多了个节点。
-
三个转发模式可以串联使用
-
动态转发常用来科学上网,本地转发用来打洞,这两种转发启动的端口都是在本地;远程转发也是打洞的一种,只不过启用的端口在远程机器上。
-
-
动态转发 (-D) SOCKS5 协议
-
动态转发指的是,本机与 SSH 服务器之间创建了一个加密连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发。它的一个使用场景就是,访问所有外部网站,都通过 SSH 转发。
-
动态转发需要把本地端口绑定到 SSH 服务器。至于 SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以叫做动态转发。
# 注意,这种转发采用了 SOCKS5 协议。访问外部网站时,需要把 HTTP 请求转成 SOCKS5 协议,才能把本地端口的请求转发出去。-N参数表示,这个 SSH 连接不能执行远程命令,只能充当隧道。 ssh -D 4444 ssh-server -N # 或者如下方式: nohup ssh -qTfnN -D *:13658 [email protected] vmstat 10 >/dev/null 2>&1
# 测试 curl -x socks5://localhost:4444 http://www.example.com # or curl --socks5-hostname localhost:4444 https://www.twitter.com
-
-
本地转发 (-L)
-
SSH 服务器作为中介的跳板机,建立本地计算机与特定目标网站之间的加密连接。本地转发是在本地计算机的 SSH 客户端建立的转发规则。
-
典型使用场景就是,打洞,经过跳板机访问无法直接连通的服务。它会指定一个本地端口(local-port),所有发向那个端口的请求,都会转发到 SSH 跳板机(ssh-server),然后 SSH 跳板机作为中介,将收到的请求发到目标服务器(target-host)的目标端口(target-port)。
# ssh -L :local-port:target-host:target-port ssh-server # local-port是本地端口,target-host是你想要访问的目标服务器,target-port是目标服务器的端口,ssh-server是 SSH 跳板机。 # target-host是ssh-server的target-host, target-host 域名解析、路由都是由ssh-server完成 ssh -L 53682:remote-server:53682 ssh-server # 测试。访问本机的53682端口,就是访问remote-server的53682端口. curl http://localhost:53682
- 将9900转发到5900(vnc端口), 实现更安全的vnc连接
ssh 127.0.0.1 -L 9900:127.0.0.1:5900 ssh 127.0.0.1 -L 8080:192.168.100.208:80 [email protected]
- 如果经常使用本地转发,可以将设置写入 ~/.ssh/config
Host test.example.com LocalForward client-IP:client-port server-IP:server-port
-
-
远程转发(-R)
-
远程端口指的是在远程 SSH 服务器建立的转发规则。主要是执行ssh转发的机器别人连不上,所以需要一台client能连上的机器当远程转发端口,要不就是本地转发了。
-
由于本机无法访问内网 SSH 跳板机,就无法从外网发起 SSH 隧道,建立端口转发。必须反过来,从 SSH 跳板机发起隧道,建立端口转发,这时就形成了远程端口转发。
-
注意远程转发需要:
-
1.sshd_config里要打开AllowTcpForwarding选项,否则-R远程端口转发会失败。
-
2.默认转发到远程主机上的端口绑定的是127.0.0.1,如要绑定0.0.0.0需要打开sshd_config里的GatewayPorts选项(然后ssh -R 后加上*:port )。这个选项如果由于权限没法打开也有办法,可配合ssh -L将端口绑定到0.0.0.0。
-
# 首先需要注意,不是在30.1.2.3 或者166.100.64.1 上执行的,而是找一台能联通 30.1.2.3 和166.100.64.1的机器来执行,在执行前Remote clients能连上 30.1.2.3 但是 30.1.2.3 和 166.100.64.1 不通,所以需要一个中介将 30.1.2.3 和166.100.64.1打通 ssh -fNR 30.1.2.3:30081:166.100.64.1:3128 [email protected] -p 2728 # 测试在Remote Client上执行下面的命令,命令就会输出服务器 166.100.64.1 的3128端口返回的内容。 curl http://30.1.2.3:30081 # 开通远程转发后,如果需要动态代理(比如访问所有web服务),那么可以在30081端口机器上(30.1.2.3)执行:表示在30081机器上(30.1.2.3)启动了一个socks5动态代理服务 nohup ssh -qTfnN -D *:13658 [email protected] -p 30081 vmstat 10 >/dev/null 2>&1
- 如果经常使用本地转发,可以将设置写入 ~/.ssh/config
Host test.example.com RemoteForward local-IP:local-port target-ip:target-port
-
# -M 用于有问题时就会自动重连,服务器 echo 机制使用的端口。-D 动态转发
ssh -vvv -N -D localhost:8527 [email protected] -p 8000
autossh -M 5678 -vvv -N -D localhost:8527 [email protected] -p 8000
# 将根目录,挂载到本地
sshfs [email protected]:/ dir
-
支持正则表达式
-
复制文件到多个 ssh 的主机时,需要两边都安装 pdsh(因此建议使用 pssh)
git clone https://github.com/chaos/pdsh.git
cd pdsh
# 配置
# 自动将主机信息写入/etc/pdsh/machines
# 开启分组管理
./configure --with-machines=/etc/pdsh/machines \
--with-dshgroups
# 编译,安装
make -j$(nproc) && make install
# 设置变量
centos7="[email protected]"
opensuse="[email protected]"
# -w 指定主机,运行 uptime 命令
pdsh -w $centos7,$opensuse "uptime"
# 效果同上,[71,208]指定71和208
pdsh -w "[email protected].[71,208]" "uptime"
# [1-254]指定整个子网
pdsh -w "[email protected].[1-254]" "uptime"
# 进入交互模式
pdsh -R ssh -w $centos7
- 需要将 ssh 主机写入文件,才能并行执行命令
# 设置变量
centos7="[email protected]"
opensuse="[email protected]"
# centos7上执行uptime
pssh -H $centos7 -P uptime
# 生成ssh主机的文件
echo $centos7 > /etc/pssh/hosts
echo $opensuse >> /etc/pssh/hosts
# 通过文件,执行命令
pssh -i -h /etc/pssh/hosts "uptime"
# -O "StrictHostKeyChecking=no" 不需要每次手动输入yes
pssh -i -O "StrictHostKeyChecking=no" -h /etc/pssh/hosts "uptime"
# prsync将当前file文件,复制到tmp目录(等同于rsync)
prsync -h /etc/pssh/hosts -l opsuser -a -r file /tmp
# pslurp将远程主机的/tmp/file文件,复制到家目录并改名为newname
pslurp -h /etc/pssh/hosts -r -L ~ \
/tmp/file newname
# pnuke杀掉nginx进程(类似于pkill)
pnuke -h /etc/pssh/hosts nginx
-
配置文件
/etc/systemd/resolved.conf
# 启动
systemctl enable systemd-resolved.service
systemctl start systemd-resolved.service
# 查看状态
resolvectl status
# 测试是否开启DNSSEC
resolvectl query sigok.verteiltesysteme.net
# 查找baidu.com的ip(类似于nslookup)
resolvectl query baidu.com
# 查看统计数据(缓存)
systemd-resolve --statistics
# 测试是否开启dns over tls
ngrep port 853
两端安装 nfs
yum install -y nfs-utils
- server:
只允许 192.168.100.0/24
访问
cat >> /etc/exports <<'EOF'
root/test 192.168.100.0/24(rw,sync)
EOF
# 更新
exportfs -arv
# 更新nfs
systemctl reload nfs
- clinent:
mount 192.168.100.208:/root/test test
-
配置文件:
/etc/squid/squid.conf
# 设置代理端口8080
http_port 8080
- 启动squid服务
systemctl start squid
- 测试
curl --proxy http://127.0.0.1:8080 www.baidu.com
-
server端配置文件:
/etc/stunnel/stunnel.conf
# client = no并非必要,只是stunnel默认为server模式
client = no
# ssl证书路径
cert = /etc/stunnel/stunnel.pem
[squid]
# 监听端口
accept = 8888
# squid端口
connect = 127.0.0.1:8081
- client端配置文件:
/etc/stunnel/stunnel-client.conf
client = yes
# ssl证书路径
cert = /etc/stunnel/stunnel.pem
[squid]
# stunnel client监听端口
accept = 127.0.0.1:1234
# stunnel server端口
connect = 127.0.0.1:8888
- 生成ssl证书
# 创建私钥
openssl genrsa -out key.pem 2048
# 使用私钥生成证书
openssl req -new -x509 -key key.pem -out cert.pem -days 1095
# 合并私钥和证书为stunnel.pem
cat key.pem cert.pem >> /etc/stunnel/stunnel.pem
- 测试
# 启动stunnel server
systemctl start stunnel
# 启动 squid
systemctl start squid
# 启动stunnel client
stunnel /etc/stunnel/stunnel-client.conf
# 测试
curl --proxy http://127.0.0.1:1234 www.baidu.com
cp /usr/share/openvpn/examples/server.conf /etc/openvpn/server/server.conf
- 安装easyrsa
pacman -S easy-rsa
# 初始化pki
easyrsa init-pki
# 生成ca
easyrsa build-ca
cp pki/ca.crt /etc/openvpn/server
# 生成servername.req servername.key
easyrsa gen-req servername nopass
cp pki/private/servername.key /etc/openvpn/server
# 生成Diffie-Hellman(DH)参数文件
openssl dhparam -out /etc/openvpn/server/dh.pem 2048
# 生成HMAC(哈希消息认证码)密钥
openvpn --genkey secret /etc/openvpn/server/ta.key
-
从 2020 年 1 月开始,它已经并入了 Linux 内核的 5.6 版本
-
wireguard是组网的『乐高积木』,就像 ZFS 是构建文件系统的『乐高积木』一样。
-
Linus Torvalds在邮件中称其为一件艺术品:work of art
Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn't perfect, but I've skimmed it, and compared to the horrors that are OpenVPN and IPSec, it's a work of art. 我能再说一次我非常喜欢它并且希望它能尽快并入内核么?或许代码不是最完美的,但是我大致浏览了一下,和OpenVPN、IPSec的恐怖相比,它就是一件艺术品。
-
服务端(server):
- 安装
yum install -y wireguard-tools
- 生成公私钥
mkdir /etc/wireguard/keys cd /etc/wireguard/keys umask 077 # 同时生成公私钥 wg genkey | tee privatekey | wg pubkey > publickey
- 配置文件
# ini格式 touch /etc/wireguard/wg0.conf [Interface] PrivateKey = <server private key> Address = 10.0.0.1/24 ListenPort = 51820 ; NAT则需要设置iptables PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE PublicKey = <client public key> AllowedIPs = 10.0.0.2/32
- 开启转发ip数据包
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
- 配置网卡 + 启动wireguard
# 新建wireguard网卡, kernel必须大于5.6 ip link add wg0 type wireguard wg setconf wg0 /dev/fd/63 ip -4 address add 10.0.0.1/24 dev wg0 ip link set mtu 8921 up dev wg0 iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 启动wireguard wg-quick up wg0 # 开机自启动 systemctl enable [email protected]
-
客户端(client):
- 安装
pacman -S wireguard-tools wireguard-dkms
- 生成公私钥(和服务端一样)
mkdir /etc/wireguard/keys cd /etc/wireguard/keys umask 077 # 同时生成公私钥 wg genkey | tee privatekey | wg pubkey > publickey
- 配置文件
touch /etc/wireguard/wg0.conf [Interface] Address = 10.0.0.2/32 PrivateKey = <client private key> DNS = 1.1.1.1 [Peer] PublicKey = <server public key> Endpoint = <server public ip>:51820 AllowedIPs = 0.0.0.0/0 ; 如果服务端开启了NAT,不能访问公共ip,则需要开启PersistentKeepalive(定期的心跳机制) PersistentKeepalive = 25
- 启动wireguard
wg-quick up wg0
-
archlinux安装的samba并不提供默认的配置文件。需要自行下载smb.conf
sudo curl -o /etc/samba/smb.conf "https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD"
-
修改配置文件。注销
[public]
[public] comment = Public Stuff path = /home/tz/Downloads # 是否需要密码。yes为不需要 public = yes # 只读 writable = no printable = no write list = @staff
-
启动
# 设置用户的smb密码 sudo smbpasswd -a tz # 修改防火墙配置 sudo iptables -A INPUT -p tcp --dport 139 -j ACCEPT sudo iptables -A INPUT -p udp --dport 137 -j ACCEPT sudo iptables -A INPUT -p udp --dport 138 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 445 -j ACCEPT sudo iptables -A INPUT -p udp --dport 445 -j ACCEPT # 启动smb systemctl start smb # 访问smb smbclient //127.0.0.1/public
- 检查端口是否有暴露
# 查看本不应该对外暴露的服务redis, 是否监听0.0.0.0
netstat -antlp
# 查看INPUT链是否有暴露端口
iptables -L -n
# 扫描redis端口6379
nmap -A -p 6379 -script redis-info 127.0.0.1
-
使用普通用户, 而不是root启动redis
-
redis配置文件加入密码验证
# redis.conf requirepass password
- 修改密钥权限
# 设置为只读
chmod 400 ~/.ssh/authorized_keys
# 加入i特殊权限, 即使是root用户也无法修改和删除
chattr +i ~/.ssh/authorized_keys
- 修改
/etc/ssh/sshd_config
# 修改默认端口
Port 22221
# 禁止root登陆
PermitRootLogin no
# 不使用dns反查, 提高ssh连接速度
UseDNS no
-
sshguard可以从标准输入中读取日志消息(适用于管道syslog)或监视一个或多个日志文件。日志消息被逐行解析以识别模式。如果检测到攻击,例如在几秒钟内多次登录失败,则会阻止有问题的IP。
-
SSHGuard最初旨在为OpenSSH服务提供额外的保护层,SSHGuard还保护范围广泛的服务,例如Vsftpd和Postfix。
-
SSHGuard 与 Fail2ban 非常相似,只是它是用C编写的(Fail2ban是用Python 编写的),更轻巧,提供的功能更少
-
centos安装
yum install sshguard # 复制配置文件 cp /usr/share/doc/sshguard-2.4.2/examples/sshguard.conf.sample /etc/sshguard.conf
- 修改
/etc/sshguard.conf
配置文件,注销以下行。
BACKEND="/usr/libexec/sshguard/sshg-fw-iptables" FILES="/var/log/auth.log /var/log/authlog /var/log/maillog" LOGREADER="LANG=C /usr/bin/journalctl -afb -p info -n1 -t sshd -t sendmail -o cat" BLACKLIST_FILE=90:/etc/sshguard.blacklist WHITELIST_FILE=/etc/sshguard.whitelist
- 启动sshguard
systemctl enable sshguard systemctl start sshguard systemctl status sshguard
- 测试
# 生成10000个密码。进行一个个尝试 for i in {1..10000} do echo $i >> /tmp/password done # 暴力破解 hydra -l root -P /tmp/password 192.168.100.208 ssh -v # 查看阻断的IP firewall-cmd --permanent --info-ipset="sshguard4" ipset list sshguard4
- 修改
-
fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽)
-
当有人在试探你的HTTP、SSH、SMTP、FTP、nginx、apache密码,只要达到你预设的次数,fail2ban就会调用防火墙屏蔽这个IP,而且可以发送e-mail通知系统管理员,是一款很实用、很强大的安全工具
-
在外网环境下,有很多的恶意扫描和密码猜测等恶意攻击行为,使用Fail2ban配合iptables/firewalld,实现动态防火墙是一个很好的解决方案
-
所有配置文件保存在
/etc/fail2ban/
目录中- 尽量不要修改主配置文件
jail.conf
,它包含一组预定义的过滤器。 - 应该复制
jail.conf
创建一个名为jail.local
的新配置文件,并根据您的意愿进行修改
# 复制jail.conf,创建jail.local文件 cd /etc/fail2ban cp jail.conf jail.local
- 尽量不要修改主配置文件
-
修改
jail.local
配置文件# 启动sshd [sshd] enabled = true # 本部分允许我们列出 IP 白名单地址列表,Fail2Ban 不会禁止与列表中的地址匹配的主机 ignoreip = 127.0.0.1/8 ::1 # 主机被禁止的秒数 bantime = 300 # 如果在最近 findtime 秒期间已经发生了 maxretry 次重试,则主机会被禁止 findtime = 300 # 是主机被禁止之前的失败次数 maxretry = 8
-
启动
# 启动 systemctl start fail2ban.service systemctl enable fail2ban.service # 查看日志 tail -f /var/log/fail2ban.log
-
测试
# 生成10000个密码。进行一个个尝试 for i in {1..10000} do echo $i >> /tmp/password done # 暴力破解 hydra -l root -P /tmp/password 192.168.100.208 ssh -v # 查看阻断的IP firewall-cmd --permanent --info-ipset="sshguard4" ipset list sshguard4
-
fail2ban相关命令用法
# 查看启用的监狱列表 fail2ban-client status # 获取sshd服务被禁止的 IP 地址 fail2ban-client status sshd # or fail2ban-client get sshd banip # 可以看到iptables防火墙联动生成、被禁止IP对应的拒绝规则 iptables -nvL # 从 Fail2Ban 中删除禁止的 IP 地址 fail2ban-client set ssh unbanip 104.218.13.80
-
DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件(/var/log/secure),当发现重复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP的功能,以帮助阻止SSH 服务器攻击(也称为基于字典的攻击和暴力破解攻击)。
-
centos7安装
wget http://mirror.neu.edu.cn/fedora-epel/7/x86_64/d/denyhosts-2.9-4.el7.noarch.rpm
rpm -ivh denyhosts-2.9-4.el7.noarch.rpm
-
启动firejail
firecfg
-
默认的软件配置项在
/etc/firejail
目录下 -
新建一个w3m的软件配置
# 禁止w3m访问网络 echo 'net none' > ~/.config/firejail/w3m.local # 别名w3m alias w3m='firejail --profile=~/.config/firejail/w3m.local w3m' # 会发现无法使用网络 w3m www.baidu.com
chattr -i
不能修改和删除文件
chattr -i /etc/sudoers
chattr -i /etc/shadow
chattr -i /etc/passwd
chattr -i /etc/grub.conf
chattr -a
只能添加内容
# 适用于日志
chattr -i /var/log/lastlog
-
如果超过100台服务器, 建议搭建一台ntp服务器
-
如果少则可以, 通过cron计划任务同步
# 每小时同步1次. 写入日志, 并将系统时间同步到硬件时间 10 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >> /var/log/ntp.log 2>&1; /sbin/hwclock -w
systemctl enable ntpd
echo -e "\n* soft core 0" >> /etc/security/limits.conf
echo -e "\n* hard core 0" >> /etc/security/limits.conf
- 三种状态:
- enforcing: 开启
- permissive: 提醒
- disabled: 关闭
# 查看selinux状态
sestatus
# 临时关闭selinux
setenforce 0
- 永久关闭selinux 修改配置文件
/etc/selinux/config
SELINUX=disabled
tcp_wrappers 为第二层防火墙, iptables 为第一层防火墙
-
两个配置文件
/etc/hosts.allow
/etc/hosts.deny
- 先检查
/etc/hosts.allow
如果条件满足, 就不会去检查/etc/hosts.deny
- 先检查
# sshd服务允许/拒绝192.168.1.1
sshd: 192.168.1.1
# sshd服务允许/拒绝所有主机
sshd: ALL
# ALL表示所有服务
ALL: 192.168.1.1
# ALL EXCEPT表示除了192.168.1.1之外
ALL:ALL EXCEPT 192.168.1.1
- 可以配置好
/etc/hosts.allow
后, 配置/etc/hosts.deny
# /etc/hosts.deny sshd:ALL
# 生成数据库,时间比较长
aide -i
# 改名
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# 把现在的文件对比之前保存的状态,时间比较长
aide -C
# 启动控制台
msfconsole
# 查看模块
show exploits
# 查看辅助模块
show auxiliary
# 搜索kvm模块
search kvm
# 查看当前模块负载
show payloads
检测基本的文件, 文件的权限, 内核模块等
-
rookit
-
1.文件级别rookit:
- 通过软件漏洞, 从而替换命令文件. 比方说/bin/login命令, 每个用户登陆都会执行该命令, 替换后从而获取密码
-
2.内核级别rookit:
- 可以修改内核, 从而劫持api, 使本是执行a程序, 变为执行b程序
-
# 更新数据库
sudo rkhunter --update
# 检查
sudo rkhunter --check
# 更新病毒库
sudo freshclam
# 扫描根目录, 发现病毒就响动
clamscan -r --bell -i /
# 扫描根目录, 并删除感染文件
clamscan -r --remove /
- 支持布尔注入、错误注入、时间注入、堆叠注入
- 支持 MySQL、Microsoft SQL Server、Postgres、Oracle、Microsoft Access 的注入
- 支持基于 GET/POST的注入、基于 Header 注入、基于 Cookie 注入、表单数据注入、基于 JSON 注入
- 支持代理选项
- 支持从 txt 文件解析请求
- 支持针对数据库、表、列和转储数据提取
- 支持操作阶段恢复
- 支持 urlencoding 跳过
- 支持基于布尔值/时间注入的提取字符验证
- 支持根据用户需求处理重定向
# 扫描系统
lynis audit system
fscan:开源的内网安全扫描工具提供了一键自动化全方位的漏洞扫描。它使用方便、功能全面,支持端口扫描、常见的服务器爆破、Web 应用漏洞扫描、NetBIOS 嗅探等功能。
-
它广泛应用于邮件网关、文件服务器和终端设备上,用于检测和删除各种恶意软件,包括病毒、木马、间谍软件等。
-
特征
-
ClamAV 旨在快速扫描文件。
-
实时保护(仅限 Linux)
-
ClamAV 可检测数百万种病毒、蠕虫、木马和其他恶意软件,包括 Microsoft Office 宏病毒、移动恶意软件和其他威胁。
-
ClamAV 的字节码签名运行时由 LLVM 或我们自定义的字节码解释器提供支持,允许 ClamAV 签名编写者创建和分发非常复杂的检测例程并远程增强扫描仪的功能。
-
签名的签名数据库确保 ClamAV 只执行受信任的签名定义。
-
ClamAV 不仅扫描档案和压缩文件,还能防御档案炸弹。内置档案提取功能包括:
- Zip(包括 SFX,不包括一些较新或较复杂的扩展)
- RAR(包括 SFX,大多数版本)
- 7Zip
- ARJ (including SFX)
- Tar
- CPIO
- Gzip
- Bzip2
- DMG
- IMG
- ISO 9660
- PKG
- HFS+ partition
- HFSX partition
- APM disk image
- GPT disk image
- MBR disk image
- XAR
- XZ
- Microsoft OLE2 (Office documments)
- Microsoft OOXML (Office documments)
- Microsoft Cabinet Files (including SFX)
- Microsoft CHM (Compiled HTML)
- Microsoft SZDD compression format
- HWP (Hangul Word Processor documents)
- BinHex
- SIS (SymbianOS packages)
- AutoIt
- InstallShield
- ESTsoft EGG
-
支持 32/64 位 Windows 可执行文件解析,也称为可移植可执行文件 (PE),包括压缩或混淆的 PE 文件:
- AsPack
- UPX
- FSG
- Petite
- PeSpin
- NsPack
- wwpack32
- MEW
- Upack
- Y0da Cryptor
-
-
支持 ELF 和 Mach-O 文件(32 位和 64 位)
-
支持几乎所有邮件文件格式
-
对其他特殊文件/格式的支持包括:
- HTML
- RTF
-
使用 CryptFF 和 ScrEnc 加密的文件
- uuencode
- TNEF(winmail.dat)
-
高级数据库更新程序,支持脚本更新、数字签名和基于 DNS 的数据库版本查询
# 启动服务
systemctl start clamav-daemon
# 查看服务
systemctl status clamav-daemon
-
ClamAV工具
clamd
:是ClamAV的守护进程,为病毒扫描提供一个长期运行的服务,可以通过TCP或Unix套接字与客户端通信clamdscan
:是一个命令行工具,通过clamd守护进程进程病毒扫描,扫描速度比clamscan更快clamscan
:是一个独立的命令行病毒扫描工具,直接加载病毒库进行扫描,而不需要clamdclamdtop
:是一个实时监控工具,用于显示clamd的活动状态,包括内存使用、线程状态等。freshclamd
: 是CLamAV的病毒库更新工具
-
配置ClamAV
-
配置文件是
/etc/clamav/clamd.conf
和/etc/clamav/freshclam.conf
-
启用TCPSocket
vim /etc/clamav/clamd.conf # Comment out or remove the LocalSocket line if it exists # LocalSocket /var/run/clamav/clamd.ctl # Uncomment and set the TCPSocket to your desired port number TCPSocket 3310 # Uncomment and set the TCPAddr to your desired IP address (usually 127.0.0.1 for local access) TCPAddr 0.0.0.0
# 重启clamd服务 systemctl restart clamav-daemon # 验证clamd是否启用了TCP socket ss -tulnp | grep clamd tcp LISTEN 0 15 0.0.0.0:3310 0.0.0.0:* users:(("clamd",pid=895,fd=4))
-
gophish:开源的网络钓鱼平台。该项目提供了一个开箱即用的网络钓鱼平台,可用于模拟钓鱼攻击。它拥有友好的 Web 管理后台,支持邮件模板、批量发送邮件、网站克隆和数据可视化,适用于企业安全培训和渗透测试等场景。
# archlinux安装
paru -S aircrack-ng
paru -S hashcat-utils
-
抓取握手包准备工作
# 列出支持监听模式的网卡。如果没有,则说明您的无线网卡不支持监视器模式。 airmon-ng # 启动wlan0的监听模式 airmon-ng start wlan0 # 查看是不是被没有wlan0,而出现wlan0mon。则表示开启监听模式成功。 iwconfig # 监听附近的802.11 beacon frames。PWR为信号,绝对值越小越好;BSSID为mac地址,CH为信道,这两个需要记住。 airodump-ng wlan0mon # 新建目录 mkdir /tmp/test # 抓取握手包(WPA/WPA2使用4次握手),需要等连接wifi的设备重新连接。如果不想等,可以使用deauth攻击。显示[ WPA handshake: bc:CC:89:5E:92:D9:B0则表示成功抓取。 # -c表示信道 --bssid表示mac地址,并将抓取的握手包保存在/tmp/test目录下。 # ??失败不知道为什么无法显示连接wifi设备的条目,同时也无法抓取握手包。 airodump-ng -c 11 --bssid 9C:5C:8E:C9:AB:C0 -w /tmp/test/ wlan0mon # 抓取成功后,按ctrl-c退出airodump-ng。我这里进行了重命名文件 mv /tmp/test/-01.cap /tmp/test/hackme.cap
-
deauth攻击:伪造的取消身份验证数据包,发送到连接wifi的设备。收到此类数据包后,大多数设备会断开与wifi并立即重新连接
# 打开一个新终端 # -0 2 发送2个deauth packets # -a 路由器的mac地址 # -c 连接wifi设备的mac地址 aireplay-ng -0 2 -a 9C:5C:8E:C9:AB:C0 -c 64:BC:0C:48:97:F7 wlan0mon # 也可以使用广播 aireplay-ng -0 2 -a 9C:5C:8E:C9:AB:C0 wlan0mon
-
破解密码
# 下载密码字典 curl -L -o dicts/rockyou.txt https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt
-
使用
naive-hashcat
破解# 将cap转换成hccapx,需要安装hashcat-utils包。在线转换网址https://hashcat.net/cap2hashcat/ cap2hccapx hackme.cap hackme.hccapx # 下载naive-hashcat git clone https://github.com/brannondorsey/naive-hashcat mv hackme.hccapx naive-hashcat/ mv rockyou.txt naive-hashcat/dicts/ cd naive-hashcat # 2500 表示 hash mode 为 WPA/WPA2 HASH_FILE=hackme.hccapx POT_FILE=hackme.pot HASH_TYPE=2500 ./naive-hashcat.sh
-
使用
hashcat
破解# archlinux安装hashcat pacman -S hashcat
-
使用
aircrack-ng
破解# 破解。-a2 specifies WPA2, -b is the BSSID, -w is the wordfile。如果看到 KEY FOUND! [ 88888888 ] 表示密码被破解,密码为88888888 aircrack-ng -a2 -b 08:4F:C9:66:77:3A -w rockyou.txt hackme.cap
- port: 9090
systemctl enable cockpit.socket
systemctl start cockpit.socket
# 防火墙设置
firewall-cmd --add-service=cockpit --permanent
- 查看任务
sudo cat /var/spool/cron/root
# 开启服务
systemctl start cronie.service
# .---------------- 分 (0 - 59)
# | .------------- 时 (0 - 23)
# | | .---------- 日 (1 - 31)
# | | | .------- 月 (1 - 12)
# | | | | .---- 星期 (0 - 7) (星期日可为0或7)
# | | | | |
# * * * * * 执行的命令
sudo crontab -e
#编辑 root 的任务crontab -e
#编辑当前用户的任务crontab -l
#显示任务crontab -r
#删除所有任务
* * * * * COMMAND # 每分钟
*/5 * * * * COMMAND # 每5分钟
0 * * * * COMMAND # 每小时
0,5,10 * * * * COMMAND # 每小时运行三次,分别在第 0、 5 和 10 分钟运行
0 0 * * * COMMAND # 每日凌晨0点执行
0 3 * * * COMMAND # 每日凌晨3点执行
0 0 1 * * COMMAND # 每月1号0点执行
0 3 1-10 * * COMMAND # 每月1日到10日凌晨3点执行
0 0 * * 1 COMMAND # 每周一0点执行
- 配置文件:
/etc/anacrontab
cron | anacron |
---|---|
它是守护进程 | 它不是守护进程 |
适合服务器 | 适合桌面/笔记本电脑 |
可以让你以分钟级运行计划任务 | 只能让你以天为基础来运行计划任务 |
关机时不会执行计划任务 | 如果计划任务到期,机器是关机的,那么它会在机器下次开机后执行计划任务 |
普通用户和 root 用户 | 只有 root 用户可以使用(使用特定的配置启动普通任务) |
7 5 cron.weekly /bin/bash /home/user/.mybin/logs.sh
# 测试配置
anacron -T
# 启动
anacron -d
-
默认端口:
http://127.0.0.1:8090/
-
主目录:
/var/lib/jenkins
-
项目路径:
/var/lib/jenkins/workspace/项目名
-
docker安装
version: '3.8' # 执行脚本;docker-compose -f docker-compose-v1.0.yml up -d services: jenkins: image: jenkins/jenkins:2.439 container_name: jenkins privileged: true user: root ports: - "9090:8080" - "50001:50000" volumes: - ./jenkins_home:/var/jenkins_home # 如果不配置到云服务器路径下,则可以配置 jenkins_home 会创建一个数据卷使用 - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/local/bin/docker - ./maven/conf/settings.xml:/usr/local/maven/conf/settings.xml # 这里只提供了 maven 的 settings.xml 主要用于修改 maven 的镜像地址 - ./jdk/jdk1.8.0_202:/usr/local/jdk1.8.0_202 # 提供了 jdk1.8,如果你需要其他版本也可以配置使用。 environment: - JAVA_OPTS=-Djenkins.install.runSetupWizard=false # 禁止安装向导「如果需要密码则不要配置」docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword restart: unless-stopped volumes: jenkins_home:
docker-compose -f docker-compose-v1.0.yml up -d
-
换源:在http://127.0.0.1:8090/manage/pluginManager/advanced
- 原本是:
https://updates.jenkins.io/update-center.json
- 替换成华为:
https://mirrors.huaweicloud.com/jenkins/updates/update-center.json
- 原本是:
-
有用的插件:插件搜索
- locale 汉化插件
- 安装后,需要重启生效
- Git
- docker
- Maven Integration
- locale 汉化插件
-
在全局工具配置里配置插件
-
jenkins-cli命令说明和下载
# 下载jenkins-cli.jar curl -LO http://127.0.0.1:8090/jnlpJars/jenkins-cli.jar # 执行help命令 java -jar jenkins-cli.jar -s http://127.0.0.1:8090/ -webSocket -auth user:passwd help # 启动名为test的任务 java -jar jenkins-cli.jar -s http://127.0.0.1:8090/ -webSocket -auth user:passwd enable-job test # 获取test任务的xml java -jar jenkins-cli.jar -s http://127.0.0.1:8090/ -webSocket -auth user:passwd get-job test
-
Continuous Integration,持续集成,本意是指编写大量的单元测试和集成测试,在尽量小的代码变更粒度上进行 提交 -> 测试 -> 自动部署 的完整流程。
-
因为测试很难覆盖所有业务场景特别是前端场景,而且测试只会在最重要的地方存在,因为写测试理论上讲比写业务逻辑更费时间,而且枯燥。
-
所以,中国互联网界的 CI 多数只有两个目的:① 跑测试保证核心模块质量顺便消灭低级错误 ② APP 打包。
-
-
CI 基本原理
- 检测到 git 有新的代码提交(定时检测或主动触发),生成任务
- agent(真正干活的进程,可以分布在多台机器) 领取任务,拉取代码,运行一段脚本(无论是单元测试还是 APP 打包,都可以用脚本完成)
- 展示结果:成功与否、测试覆盖率、apk ipa 下载链接等
-
Gitlab-CI
-
优点:
-
Gitlab-CI 是 Gitlab 自带的持续集成引擎,免去了第三方 CI 服务器只能定时检测 git 仓库带来的延迟和对 git server 造成的性能压力。我司弃用 oschina 的原因就是 CI 服务器一分钟检测一次,压力太大导致仓库被封。
-
触发成本低,系统已经提供了完善的触发功能
-
结果直接展示在 Gitlab 页面上的多个地方:成功/失败,测试覆盖率等
-
无需复杂配置。(Jenkins 的页面逻辑太落后了,极其的复杂。TeamCity 我本以为配置算简单的,直到我用上了 Gitlab-CI)
- yaml 语言描述的 CI 配置,很容易读懂
-
-
缺点:
-
资源消耗过高。它需要 2G 内存机器,而且在 pull 或 push 的瞬间磁盘 IO 相当高,部署在阿里云会直接导致虚拟机假死,只适合内存大,磁盘强的物理机部署。
-
必须使用 Gitlab
-
-
-
GitLab Runner:如果有多台服务器的话,不建议将GitLab Runner安装在GitLab服务器上,运行GitLab Runner可能消耗大量内存。
-
yum安装
-
新建一个gitlab的repo
cat > /etc/yum.repos.d/gitlab-ce.repo << EOF [gitlab-ce] name=Gitlab CE Repository # 清华源 baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el\$releasever/ gpgcheck=0 enabled=1 EOF
# 查找yum源中gitlab-ce的版本 yum list gitlab-ce --showduplicates # 安装需要的版本 yum install -y gitlab-ce-16.8.1
-
手动下载安装
# 下载 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.8.1-ce.0.el7.x86_64.rpm # 安装 rpm -ivh gitlab-ce-16.8.1-ce.0.el7.x86_64.rpm
-
配置文件:
/etc/gitlab/gitlab.rb
# 先备份配置文件 cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak
# gitlab访问地址。内网主机的 ip 地址 external_url 'http://gitlab.example.com' # 设置为tcp,而不是unix gitlab_workhorse['listen_network'] = "tcp" # ip和端口 gitlab_workhorse['listen_addr'] = "127.0.0.1:8181" # 将IP子网段添加到可信代理中 gitlab_rails['trusted_proxies'] = ['127.0.0.1'] # git仓库路径。记得mkdir /root/gitlab-gitdir git_data_dirs({ "default" => { "path" => "/root/gitlab-gitdir" } }) # 设置时区为上海 gitlab_rails['time_zone'] = 'Asia/Shanghai' # 设置邮箱 gitlab_rails['gitlab_email_enabled'] = true # 设置自己的邮箱 gitlab_rails['gitlab_email_from'] = '[email protected]' gitlab_rails['gitlab_email_display_name'] = 'Example' # 设置自己的邮箱 gitlab_rails['gitlab_email_reply_to'] = '[email protected]' gitlab_rails['gitlab_email_subject_suffix'] = '[GitLab]' # 设置smtp gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.163.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "[email protected]" gitlab_rails['smtp_password'] = "authCode" # <--- 说明:先在邮箱设置中开启客户端授权码,防止密码泄露,此处填写网易邮箱的授权码,不要填写真实密码 gitlab_rails['smtp_domain'] = "163.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true # 禁止用户修改用户名 gitlab_rails['gitlab_username_changing_enabled'] = true # Git用户和组信息 user['username'] = "git" user['group'] = "git" user['home'] = "/home/git" user['git_user_name'] = "GitLab" user['git_user_email'] = "[email protected]" # web服务器 web_server['external_users'] = ['nginx', 'root'] web_server['username'] = 'nginx' web_server['group'] = 'nginx' # 默认自带了nginx,不需要手动配置。以下为禁用gitlab自带的nginx nginx['enable'] = false
-
配置nginx集成gitlab
-
启动gitlab和nginx
# 加载配置 systemctl start gitlab-runsvdir gitlab-ctl reconfigure # 启动gitlab gitlab-ctl start # 启动nginx systemctl start nginx
路径 | 描述 |
---|---|
/var/log/message | 核心系统日志文件,包含系统启动引导,系统运行状态和大部分错误信息等都会记录到这个文件,因此这个日志是故障诊断的首要查看对象。 |
/var/log/dmesg | 核心启动日志,系统启动时会在屏幕显示与硬件有关的信息,这些信息会保存在这个文件里面。 |
/var/log/secure | 验证,授权和安全日志,常见的用户登录验证相关日志就存放在这里。 |
/var/log/spooler | UUCP和news设备相关的日志信息 |
/var/log/cron | 与定时任务相关的日志信息 |
/var/log/maillog | 记录每一个发送至系统或者从系统发出的邮件活动 |
/var/log/boot | 系统引导日志 |
- 默认配置
/etc/logrotate.conf
# 按周轮训
weekly
# 保留4周日志备份
rotate 4
# 标记分割日志并创建当前日志
create
# 使用时间作为后缀
dateext
# 对 logrotate.d 目录下面的日志种类使用
include /etc/logrotate.d
# 对于wtmp 和 btmp 日志处理在这里进行设置
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
-
需要注意的是,虽然rsyslog支持直接从/dev/log中读取日志,但是当前上游以及发行版都关闭了此选项,默认从journal获取日志,防止与journal争夺/dev/log的所有权。
-
rsyslog 是syslog 的升级版
-
rsyslog负责/var/log/下大部分日志文件的日志生产,当前在/etc/rsyslog.conf中这些日志文件都有默认的配置。
*.info;mail.none;authpriv.none;cron.none /var/log/messages <== 记录除了mail、authpriv、cron之外,所有的info等级以上的日志 authpriv.* /var/log/secure <== 记录权限相关日志pam mail.* -/var/log/maillog <== 记录邮件相关日志 cron.* /var/log/cron <== 记录定时任务相关日志 *.emerg :omusrmsg:* <== omusrmsg:后的*表示所有用户都会接收到emerg等级的消息,这里可以指定用户 uucp,news.crit /var/log/spooler <== 新闻相关日志 local7.* /var/log/boot.log <== 启动相关的所有等级日志(local*用来实现灵活配置设施,local7用于记录系统启动和关机)
-
rsyslog中,日志按严重程度从低到高,分为下面11类
debug, info, notice, warning, warn (same as warning), err, error (same as err), crit, alert, emerg, panic (same as emerg)
- 以 systemd 中打印日志为例,打印emerg等级的日志函数log_emergency_errno最后就是通过给journal socket发送消息完成,后续日志的回显和打印都是交给journal操作。
-
两种配置模式:
-
1.客户端-服务器:客户端发送日志到服务器
-
2.服务器-远程服务器:服务器在网络收集主机的日志,发送到远程服务器
-
-
客户端-服务器模式:
-
服务器配置:
# 取消这2行注释,开启udp514端口 $ModLoad imudp $UDPServerRun 514 # 在$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat下面添加这5行 # 根据客户端的IP单独存放主机日志在不同目录,设置远程日志存放路径及文件名格式 $template Remote,"/var/log/syslog/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log" # 排除本地主机IP日志记录,只记录远程主机日志 :fromhost-ip, !isequal, "127.0.0.1" ?Remote
-
客户端配置:
# 取消这5行注释 $ActionQueueFileName fwdRule1 $ActionQueueMaxDiskSpace 1g $ActionQueueSaveOnShutdown on $ActionQueueType LinkedList $ActionResumeRetryCount -1 # 在最后一行添加服务器IP地址。@表示使用udp *.* @192.168.31.80
-