linux
1.openssh
OpenSSH 是一种让用户安全访问远程系统的网络协议,为不安全网络中的两台主机提供了一个强加密数据通信通道。作为 Linux 和 UNIX 系统管理员操作和管理主机的首选方式,SSH 比其他通信方式更加安全
1.1安全策略
更新和配置 SSH 配置文件:
- 编辑 OpenSSH 服务器主配置文件(通常位于 /etc/ssh/sshd_config)
- 禁用 root 登录,并使用普通用户登录后再切换到 root 用户
- 禁用密码身份验证,仅允许密钥身份验证
- 配置 SSH 端口转发,以限制端口转发的使用
- 设置登陆会话超时时间以防止不活动的会话占用系统资源
- 置防火墙规则以允许通过 SSH 访问的 TCP 端口(默认为端口 22)
- 使用密钥身份验证(公钥/私钥对)而不是密码身份验证。确保私钥文件具有适当的权限并定期更新密钥
1.2openssh免密认证
- 生成密钥对:首先,在客户机上生成一对密钥,包括公钥和私钥。这通常使用 ssh-keygen 命令来完成
- 将公钥传给远程机器:将生成的公钥传输到要免密登录的远程主机
- 这种免密登录的原理基于非对称加密,确保了安全性。在实际应用中,我们需要将客户机的公钥添加到远程服务器的可信列表中,以便实现免密登录
请求加密的过程:
1.当客户机尝试登录到远程主机时,远程主机会向客户机发送一个随机字符串。
2.客户机使用自己的私钥对该随机字符串进行加密,并将加密后的结果发送回远程主机。
3.远程主机使用客户机的公钥解密接收到的密文,并将解密的结果与之前生成的随机字符串进行比较。
4.如果匹配成功,客户机将被授权登录
示例:
#默认Ubutu和Rocky都安装了openssh-server
[17:39:26root@ubuntu ~]# ssh-keygen -P "" -f /root/.ssh/id_rsa #在本机生成一个没有密码的密钥对
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:wusSpRK82FrETJo66nQIweLx6NidcGbkC9/8EkuMnUo root@ubuntu
The key's randomart image is:
+---[RSA 3072]----+
| |
|. . |
|oX . |
|=.Xo .. |
|o*o+=*o.S |
|B.*OE=*o |
|oB.+=++o |
|+ . o.o. |
|.. .... |
+----[SHA256]-----+
[17:51:48root@ubuntu ~]# sshpass -p '123456' scp -o StrictHostKeyChecking=no -r /root/.ssh root@10.0.0.22:
#把公钥文件发送发指定服务器
[17:51:53root@ubuntu ~]# ssh 10.0.0.22
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-167-generic x86_64)
#链接上了
脚本:
OS_ID=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+).*"$@\1@p' /etc/os-release`
PASS="123456"
END="254"
IP=`ip a |sed -nr 's/^.*inet ([0-9.]+)\/[0-9]+ brd.*/\1/p'`
NET=${IP%.*}.
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_BLUE="echo -en \\033[1;34m"
SETCOLOR_NORMAL="echo -en \E[0m"
${SETCOLOR_BLUE} "$1" && $MOVE_TO_COL
${SETCOLOR_NORMAL}
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
environment () {
rm -rf /root/.ssh &>/dev/null
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
if [[ $OS_ID =~ Centos|Rocky ]];then
rpm -q sshpass &>/dev/null || yum -y install sshpass
[ $? -eq "0" ] || { color "安装sshpass失败" 1 ;exit; }
elif [[ $OS_ID =~ Ubuntu ]];then
dpkg -l sshpass &> /dev/null ||{ apt update; apt -y install sshpass; }
[ $? -eq "0" ] || { color "安装sshpass失败" 1 ; exit; }
fi
}
key () {
ssh-keygen -P "" -f /root/.ssh/id_rsa &>/dev/null
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP &>/dev/null
#使用 sshpass 工具将本地的 SSH 公钥复制到指定 IP 地址的远程主机上,同时忽略主机密钥的严格检查
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}: &>/dev/null
color ${n} 0
done
#把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入回车
mian () {
environment
key
}
mian
}
2.sudo
sudo 是 Unix 和类 Unix 操作系统中的一种命令,允许系统管理员授予普通用户以执行特定任务或命令的权限。sudo 的配置文件通常是 /etc/sudoers 文件。下面是 sudo 配置文件的格式以及一些示例:
sudo 配置文件格式:
sudo 配置文件的语法比较特殊,主要由一系列的条目组成,每个条目包含了一个用户或用户组、一个主机列表、一个命令别名或一个别名的别名以及一系列的命令规范。配置文件的语法比较严格,一般建议使用 visudo 命令来编辑,以避免语法错误。
示例:
1.授权用户指定的命令权限:
user1 ALL=(ALL) /usr/bin/apt-get update
2.授权用户在指定目录下执行所有权限:
user2 ALL=(ALL) /usr/bin/cat /var/www/*
#这个是有bug的,这样也可以查看到里面的内容
cat /var/www/11 /etc/passwd
#更改为:
user2 ALL=(ALL) /usr/bin/cat ^/var/log/[a-zA-Z0-9]+$
3.授予用户无密码执行命令的权限:
user3 ALL=(ALL) NOPASSWD: /sbin/reboot
4.授予用户组执行所有命令的权限,等同于root:
%group1 ALL=(ALL) ALL
3.PAM架构
PAM(Pluggable Authentication Modules,可插拔认证模块)是一个用于认证服务的系统架构,它允许系统管理员配置灵活的认证方法,并提供了一种标准化的方式来实现认证、授权和账户管理功能。下面是 PAM 架构及其工作原理的总结:
PAM 架构:
PAM 架构主要由四个组件组成:
1.应用程序(Applications): 需要进行身份验证、授权或账户管理的应用程序或服务。
2.PAM 库(PAM Library): 提供了 PAM 接口的库,应用程序通过调用这些库来与 PAM 进行通信。
3.PAM 配置文件(PAM Configuration Files): 存储了针对特定应用程序的认证、授权和账户管理的规则和设置。
4.认证模块(Authentication Modules): 实际执行身份验证的模块,可以是本地密码验证、基于 LDAP 的认证、双因素认证等。
工作原理:
PAM 的工作原理可以分为以下几个步骤:
1.应用程序调用: 当一个应用程序需要进行身份验证、授权或账户管理时,它会调用 PAM 库提供的 API。
2.PAM 堆栈处理: PAM 库根据应用程序的请求,查找并加载相应的 PAM 配置文件。配置文件定义了一系列 PAM 模块的堆栈,每个模块负责执行特定的任务,如认证、授权或账户管理。
3.模块执行: PAM 框架按照配置文件中定义的顺序依次执行堆栈中的各个模块。每个模块都会根据其配置返回一个状态,通常是成功、失败或跳过。如果一个模块失败了,PAM 框架可以根据管理员配置的策略来决定是否继续执行后续模块。
4.结果返回: 当所有模块都执行完毕后,PAM 框架会根据各个模块的返回状态来判断整个身份验证过程是否成功。如果所有模块都返回成功,则 PAM 框架会通知应用程序身份验证成功,否则会返回失败信息。
总结:
PAM 架构提供了一种灵活和可定制的方式来实现认证、授权和账户管理功能。通过合理配置 PAM 配置文件,系统管理员可以根据实际需求定制认证策略,并使用各种认证模块来实现多种认证方式。这使得 PAM 成为了许多 Unix 和类 Unix 系统中广泛应用的认证框架。
3.1PAM配置文件格式,模块
PAM 配置文件格式:
PAM 配置文件通常存储在 /etc/pam.d/ 目录下,每个配置文件对应一个特定的应用程序或服务。PAM 配置文件的格式如下:
type control module-path module-arguments
type: 表示要执行的操作类型,如认证(auth)、授权(account)、密码管理(password)和会话管理(session)等。
control: 定义了模块的执行方式,常见的控制方式包括 required(必须成功)、sufficient(满足一个即可)、optional(可选的)和requisite(必须执行,但是不返回成功也可以)等。
module-path: 指定了要执行的认证模块的路径或名称。
module-arguments: 模块执行时可能需要的参数,可以根据模块的要求来指定。
示例:
1.nologin 模块:
vim /etc/pam.d/login
auth required pam_nologin.so
#这个示例中,pam_nologin 模块被配置在 auth 类型中,表示在身份验证过程中检查是否存在 /etc/nologin 文件,如果存在则发送文件里面的内容,拒绝用户登录
2.limits 模块:
#限制资源模块
vim /etc/security/limits.conf
#建议成产案例
* soft core unlimited #core文件大小
* hard core unlimited
* soft nproc 1000000 #最大运行进程数
* hard nproc 1000000
* soft nofile 1000000 #最大可以打开的文件数量
* hard nofile 1000000
* soft memlock 32000 #最大可用内存空间
* hard memlock 32000
* soft msgqueue 8192000 #最大消息队列数
* hard msgqueue 8192000
这个示例中,pam_limits 模块被配置在 session 类型中,表示在用户会话开始时应用资源限制,例如 CPU 时间、内存、文件打开数等。
ulimit -a #查看模块功能的列表
ulimit -n #限制同时访问资源打开的个数;临时更改
4.私有时间服务器
#!/bin/bash
#
#**********************************************************************************************
#Author: luomu
#Date: 2024-03-06
#FileName: ntp.sh
#Description: The test script
#Copyright (C): 2024 All rights reserved
#*********************************************************************************************
OS_ID=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+).*"$@\1@p' /etc/os-release`
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_BLUE="echo -en \\033[1;34m"
SETCOLOR_NORMAL="echo -en \E[0m"
${SETCOLOR_BLUE} "$1" && $MOVE_TO_COL
${SETCOLOR_NORMAL}
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
time_datectl () {
if [[ $OS_ID =~ Rocky|CentOS ]];then
rpm -q chrony &>/dev/null || yum -y install chrony
systemctl enable --now chronyd.service &>/dev/null
sed -e 's/^pool/#pool/' \
-e '/^#pool/a\server ntp.aliyun.com iburst ' \
#这里是与互联网时间同步的网址可以更改
-e '/^#pool/a\server time1.cloud.tencent.com iburst' \
-e '/^#pool/a\server ntp.tuna.tsinghua.edu.cn iburst' \
-e 's/^#allow.*/allow 10.0.0.0\/24/' \
-e 's/^#local/local/' \
-i.bask \
/etc/chrony.conf
systemctl restart chronyd.service
[ $? -eq 0 ] && color 完成外网时间同步 0
elif [[ $OS_ID =~ Ubuntu ]];then
dpkg -l chrony &>/dev/null || { apt update; apt -y -q install chrony; }
systemctl enable --now chronyd.service &>/dev/null
sed -e 's/^pool/#pool/' \
-e '/ntp.ubuntu.com/i\server ntp.aliyun.com iburst' \
-e '/ntp.ubuntu.com/i\server time1.cloud.tencent.com iburst' \
-e '/ntp.ubuntu.com/i\server ntp.tuna.tsinghua.edu.cn iburst' \
-e '$a\allow 10.0.0.0/24' \
-e '$a\local stratum 10' \
-i.bask \
/etc/chrony/chrony.conf
systemctl restart chronyd.service
[ $? -eq 0 ] && color 完成外网时间同步 0
else
color 不支持此系统 1
fi
}
time_datectl
#需要开放UDP123端口
#客户端需要开放323端口
5.DNS域名
DNS(Domain Name System,域名系统)是互联网中用于将域名解析为 IP 地址的分布式数据库系统。它的工作原理可以简单概括为客户端发起查询请求,DNS 服务器根据查询请求返回相应的记录
域名三级结构
域名的三级结构是指域名的层次结构,它通常由三个部分组成,分别是顶级域(Top-Level Domain,TLD)、二级域(Second-Level Domain)和子域(Subdomain)
- 顶级域(Top-Level Domain,TLD): 顶级域是域名中的最高级别,通常表示国家、地区或特定类型。例如,.com、.org、.net 是常见的通用顶级域,而像 .cn、.uk、.us 则表示国家代码顶级域。在域名的三级结构中,顶级域位于最右侧,是整个域名的最高级别
- 二级域(Second-Level Domain): 二级域是位于顶级域之下的一级域名。它通常用于表示组织、公司、机构或个人的名称。例如,在域名 example.com 中,“example” 就是二级域名。二级域名是在顶级域的范围内注册的,它是许多网站和电子邮件地址的一部分
- 子域(Subdomain): 子域是位于二级域之下的域名分支。它是二级域名的一部分,可以用来进一步细分和组织网站内容。例如,在域名 www.example.com 中,“www” 就是子域,通常用于表示网站的主页。除了 “www” 外,还可以使用其他任意子域,如 blog.example.com、mail.example.com 等
DNS工作原理,迭代和递归
- 域名解析请求: 当用户在浏览器中输入一个域名时,操作系统会向本地 DNS 解析器发起域名解析请求。
- 本地 DNS 解析器: 本地 DNS 解析器首先检查本地缓存中是否有与请求域名相关的记录。如果有,它会直接返回相应的 IP 地址
- 递归查询: 如果本地缓存中没有相应记录,本地 DNS 解析器将发起一个递归查询请求,向根域名服务器查询请求
- 根域名服务器: 根域名服务器负责维护顶级域名服务器(如 .com、.net、.org 等)的地址信息。当根域名服务器接收到请求后,它会返回指向相应顶级域名服务器的 IP 地址
- 顶级域名服务器: 顶级域名服务器负责维护二级域名服务器(如 .com 域名下的域名服务器)的地址信息。当接收到请求后,它会返回指向相应二级域名服务器的 IP 地址
- 权威域名服务器: 最终,权威域名服务器负责维护该域名的 IP 地址信息。当权威域名服务器接收到查询请求时,它会返回相应的 IP 地址给本地 DNS 解析器
- 本地 DNS 解析器返回结果: 本地 DNS 解析器收到来自权威域名服务器的响应后,将结果返回给用户的操作系统,然后操作系统将 IP 地址返回给浏览器,浏览器利用这个 IP 地址建立与服务器的连接
迭代和递归查询:
迭代查询: 在迭代查询中,DNS 解析器向 DNS 服务器发起查询请求,并要求服务器给出最佳的答案。如果 DNS 服务器无法立即提供答案,则它会将请求转发给其他 DNS 服务器,并将这些中间结果返回给 DNS 解析器,以便解析器继续向其他服务器发起查询。这个过程会重复多次,直到找到最终的答案或者达到查询超时。
递归查询: 在递归查询中,DNS 解析器向 DNS 服务器发起查询请求,并要求服务器为其解析整个域名链。DNS 服务器会负责迭代地向其他服务器查询,直到找到最终的答案,并将该答案返回给 DNS 解析器。DNS 解析器不需要了解查询的具体细节,只需要等待最终结果即可。
总结:
递归查询是 DNS 解析器向 DNS 服务器发起的请求类型,而迭代查询则是 DNS 服务器向其他服务器发起的请求类型。在 DNS 工作过程中,通常使用这两种类型的查询来查找和解析域名
实现私有DNS
#定义域名为luomu.com
[17:57:56root@ubuntu ~]# apt install -y bind9 bind9-utils bind9-host
[20:14:39root@ubuntu ~]# dpkg -l bind9-utils
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-==========================-============-=================================
ii bind9-utils 1:9.16.48-0ubuntu0.20.04.1 amd64 Utilities for BIND 9
[20:18:49root@ubuntu ~]# sed -i 's/dnssec-validation auto/dnssec-validation no/' /etc/bind/named.conf.options
#禁用 DNSSEC 验证
[20:18:49root@ubuntu ~]# vim /etc/bind/named.conf.default-zones
zone "luomu.com" IN {
type master;
file "/etc/bind/luomu.com.zone";
};
[20:20:36root@ubuntu ~]# vim /etc/bind/luomu.com.zone
@ IN SOA master admin (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS master
master A 本机ip
www A 本地服务ip
chgrp bind /etc/bind/luomu.com.zone #加载配置文件
[20:25:14root@ubuntu ~]# systemctl start named
#启动服务
6.iptables
iptables 是 Linux 中用于配置和管理 IPv4 包过滤和网络地址转换的工具。它允许系统管理员定义规则,控制入站和出站流量,实现网络安全和路由策略
6.1五表五链
表(Tables):
filter 表:
主要用于过滤和阻止数据包。常见的链包括 INPUT、FORWARD 和 OUTPUT。
nat 表:
主要用于网络地址转换(NAT)。常见的链包括 PREROUTING、POSTROUTING 和 OUTPUT。
mangle 表:
主要用于修改数据包的 IP 头信息。常见的链包括 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING。
raw 表:
主要用于配置数据包的处理方式。常见的链包括 PREROUTING 和 OUTPUT。
security 表:
主要用于 SELinux 的安全标签处理。
链(Chains):
INPUT 链:
用于处理进入系统的数据包。
FORWARD 链:
用于转发通过系统的数据包。
OUTPUT 链:
用于处理从系统发出的数据包
基本使用:
#查看规则
[20:30:40root@ubuntu ~]# iptables -nvL
Chain INPUT (policy ACCEPT 38 packets, 2184 bytes)
pkts bytes target prot opt in out source destination
#清除规则
[20:30:45root@ubuntu ~]# iptables -F
#允许特定端口访问
[20:35:15root@ubuntu ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#拒绝指定IP
[20:35:22root@ubuntu ~]# iptables -A INPUT -s 10.0.0.100 -j DROP
6.2 NAT转换原理
Network Address Translation(网络地址转换,NAT)是一种用于在私有网络和公共网络之间转换 IP 地址的技术。它在路由器或防火墙上执行,允许多个主机共享单个公共 IP 地址,并提供一定程度的安全性
NAT 转换原理:
NAT 转换通常在路由器或防火墙上实现。当数据包从内部网络传输到外部网络时,它们的源 IP 地址会被转换为路由器或防火墙的公共 IP 地址。当数据包从外部网络传输到内部网络时,目标 IP 地址会被转换为内部网络中的私有 IP 地址
6.2.1SNAT
SNAT 是一种将内部主机的私有 IP 地址映射到公共 IP 地址的 NAT 转换。当内部主机发送数据包到外部网络时,路由器或防火墙会将数据包的源 IP 地址替换为公共 IP 地址,并将此映射信息存储在 NAT 表中。当响应数据包返回时,路由器或防火墙将公共 IP 地址转换回对应的私有 IP 地址
实现:
#注意: 需要开启 ip_forward
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9
#除了10网段源地址访问非10w网段的目标地址就转到指定的公网ip
6.2.3DNAT
DNAT 是一种将外部网络中的公共 IP 地址映射到内部网络中的私有 IP 地址的 NAT 转换。当外部网络中的数据包传输到内部网络时,路由器或防火墙会将数据包的目标 IP 地址替换为对应的内部主机的私有 IP 地址,并将此映射信息存储在 NAT 表中
iptables -t nat -A PREROUTING -d 192.168.10.48 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.7:80
#访问192.168.10.48端口的的tcp协议的80端口就通过DNAT转到本地的10.0.0.7的80端口