Linux,第五篇
SUDO,PAM配置规范说明
SUDO
sudo组成
包:sudo
配置文件:/etc/sudo.conf
授权规则配置文件:
/etc/sudoers
/etc/sudoers.d
安全编辑授权规则文件和语法检查工具
/usr/sbin/visudo
范例:
#检查语法
visudo -c
#检查指定配置文件语法
visudo -f /etc/sudoers.d/test
授权编辑规则文件的工具:/usr/bin/sudoedit
执行授权命令:/usr/bin/sudo
时间戳文件:/var/db/sudo
日志文件:/var/log/secure
sudo 授权规则配置
配置文件格式说明:/etc/sudoers, /etc/sudoers.d/
配置文件中支持使用通配符 glob
? 任意单一字符
* 匹配任意长度字符
[wxc] 匹配其中一个字符
[!wxc] 除了这三个字符的其它字符
\x 转义
[[alpha]] 字母
范例:
/bin/ls [[alpha]]*
配置文件规则有两类
- 别名定义:不是必须的
- 授权规则:必须的
sudoers 授权规则格式:
用户 登入主机=(代表用户) 命令
user host=(runas) command
范例:
root ALL=(ALL) ALL
格式说明:
user: 运行命令者的身份
host: 通过哪些主机
(runas):以哪个用户的身份
command: 运行哪些命令
sudoers的别名
User和runas:
username
#uid
%group_name
%#gid
user_alias|runas_alias
host:
ip或hostname
network(/netmask)
host_alias
command:
command name
directory
sudoedit
Cmnd_Alias
sudo别名有四种类型:
- User_Alias
- Runas_Alias
- Host_Alias
- Cmnd_Alias
别名格式:
[A-Z]([A-Z][0-9]_)*
别名定义:
Alias_Type NAME1 = item1,item2,item3 : NAME2 = item4, item5
PAM
PAM相关文件
- 包名: pam
- 模块文件目录:/lib64/security/*.so
- 特定模块相关的设置文件:/etc/security/
- 应用程序调用PAM模块的配置文件
- 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
- 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
- 注意:如/etc/pam.d存在,/etc/pam.conf将失效
范例:查看程序是否支持PAM
[root@centos8 ~]#ldd `which sshd` |grep libpam
libpam.so.0 => /lib64/libpam.so.0 (0x00007fea8e70d000)
[root@centos8 ~]#ldd `which passwd` |grep pam
libpam.so.0 => /lib64/libpam.so.0 (0x00007f045b805000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f045b601000)
#不支持PAM
[root@centos6 ~]#ldd /usr/sbin/httpd |grep pam
[root@centos6 ~]#
PAM工作原理
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证
文件(位于/lib64/security下)进行安全认证
PAM认证过程示例:
1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是
在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入
密码或者通过验证)
PAM 配置文件格式说明
通用配置文件/etc/pam.conf格式,此格式不使用
application type control module-path arguments
专用配置文件/etc/pam.d/ 格式
type control module-path arguments
application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确
配置的其它服务
type:指模块类型,即功能
control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
module-path: 用来指明本模块对应的程序文件的路径名
Arguments: 用来传递给该模块的参数
模块类型(module-type)
- Auth 账号的认证和授权
- Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务
的访问时间,限制用户的位置(例如:root用户只能从控制台登录) - Password 用户修改密码时密码复杂度检查机制等功能
- Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有
用
Control:
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结
果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应
用程序,即为必要条件 - requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执
行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件 - sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其
它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的required和requisite - optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
- include: 调用其他的配置文件中定义的配置信息
module-path:
- 模块文件所在绝对路径:
- 模块文件所在相对路径:/lib64/security目录下的模块可使用相对路径,如:pam_shells.so、
pam_limits.so - 有些模块有自已的专有配置文件,在/etc/security/*.conf目 录下
Arguments
- debug :该模块应当用syslog( )将调试信息写入到系统日志文件中
- no_warn :表明该模块不应把警告信息发送给应用程序
- use_first_pass :该模块不能提示用户输入密码,只能从前一个模块得到输入密码
- try_first_pass :该模块首先用前一个模块从用户得到密码,如果该密码验证不通过,再提示用户
输入新密码 - use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码
- expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏
用户名会对安全造成一定程度的威胁
注意:修改PAM配置文件将马上生效
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
chrony搭建私有ntp服务
服务端配置
[root@localhost mnt]# hostname -I
20.0.0.100
#查看客户端IP
[root@localhost mnt]#yum -y install chrony
[root@localhost mnt]#vim /etc/chrony.conf
#打开配置文件
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server cn.pool.ntp.org
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
#这个位置写公网ntp服务器地址
#################################
#此处省略
#################################
# Allow NTP client access from local network.
allow 0.0.0.0/0
#这个位置取消注释,并且网段代表允许同步的服务器地址范围,如20.0.0.0/24
# Serve time even if not synchronized to a time source.
local stratum 10
#当互联网无法连接,仍然可以为客户端提供时间同步服务
[root@localhost mnt]#systemctl restart chronyd
#服务启动后会打开端口123/udp
[root@localhost mnt]#ss -ntlu
[root@localhost mnt]# chronyc sources -v #^*表示同步成功
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current best, '+' = combined, '-' = not combined,
| / 'x' = may be in error, '~' = too variable, '?' = unusable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- ntp8.flashdance.cx 2 6 75 38 +4278us[+3986us] +/- 128ms
^- 203.107.6.88 2 6 377 34 +499us[ +203us] +/- 32ms
^* 120.25.115.20 2 6 377 27 -161us[ -463us] +/- 4830us
客户端配置
[root@localhost network-scripts]# vim /etc/chrony.conf
server 20.0.0.100 iburst #填写私网NTP服务地址
[root@localhost network-scripts]#systemctl restart
[root@localhost network-scripts]chronyc sources -v
[root@localhost network-scripts]# chronyc sources -v #^*表示同步成功
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current best, '+' = combined, '-' = not combined,
| / 'x' = may be in error, '~' = too variable, '?' = unusable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 20.0.0.100 3 6 377 39 +263us[ -3647s] +/- 6533us
CDN原理
CDN工作原理
- 用户向浏览器输入www.a.com这个域名,浏览器第一次发现本地没有dns缓存,则向网站的DNS服
务器请求 - 网站的DNS域名解析器设置了CNAME,指向了www.a.tbcdn.com,请求指向了CDN网络中的智能
DNS负载均衡系统 - 智能DNS负载均衡系统解析域名,把对用户响应速度最快的IP节点返回给用户;
- 用户向该IP节点(CDN服务器)发出请求
- 由于是第一次访问,CDN服务器会通过Cache内部专用DNS解析得到此域名的原web站点IP,向原
站点服务器发起请求,并在CDN服务器上缓存内容 - 请求结果发给用户
搭建智能DNS,实现不同地域客户端解析到不同主机
sed -i -r s/dhcp/static/ /etc/sysconfig/network-scripts/ifcfg-eth0
cat >> /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
IPADDR=20.0.0.68
PREFIX=24
GATEWAY=20.0.0.2
DNS1=20.0.0.2
EOF
nmcli connection reload
nmcli networking off ;nmcli networking on
yum -y install httpd;systemctl enable httpd --now;hostname -I >/var/www/html/index.html
实验环境
需要五台主机
DNS主服务器和web服务器1:20.0.0.8/24,172.16.0.8/16
web服务器2(sz):20.0.0.18/24
web服务器3(sh):172.16.0.18/16 (20.0.0.58的eth1网卡)
DNS客户端1:20.0.0.28/24
DNS客户端2:172.16.0.28/16 (20.0.0.68的eth1网卡)
前提准备
关闭SElinux
关闭防火墙
时间同步
实现步骤
DNS 服务器的网卡配置
#配置两个IP地址
#eth0:20.0.0.8/24
#eth1: 172.16.0.8/16
主DNS服务端配置文件实现 view解释DNS解析流程
yum install bind -y
vim /etc/named.conf
#在文件最前面加下面行
acl shenzhennet {
20.0.0.0/24;
};
acl shanghainet {
172.16.0.0/16;
};
acl othernet {
any;
};
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
#其它略
# 创建view
view shenzhenview {
match-clients { beijingnet;};
include "/etc/named.rfc1912.zones.sz";
};
view shanghaiview {
match-clients { shanghainet;};
include "/etc/named.rfc1912.zones.sh";
};
view otherview {
match-clients { othernet;};
include "/etc/named.rfc1912.zones.other";
};
include "/etc/named.root.key";
实现区域配置文件
vim /etc/named.rfc1912.zones.sz
zone "." IN {
type hint;
file "named.ca";
};
zone "chenqizhi.org" {
type master;
file "chenqizhi.org.zone.sz";
};
vim /etc/named.rfc1912.zones.sh
zone "." IN {
type hint;
file "named.ca";
};
zone "chenqizhi.org" {
type master;
file "chenqizhi.org.zone.sh";
};
vim /etc/named.rfc1912.zones.other
zone "." IN {
type hint;
file "named.ca";
};
zone "chenqizhi.org" {
type master;
file "chenqizhi.org.zone.other";
};
chgrp named /etc/named.rfc1912.zones.sz
chgrp named /etc/named.rfc1912.zones.sh
chgrp named /etc/named.rfc1912.zones.other
创建区域数据库文件
vim /var/named/chenqizhi.org.zone.bj
$TTL 1D
@ IN SOA master admin.chenqizhi.org. ( 20230820 180 10M 1D 6H )
NS master
master A 20.0.0.8
websrv A 20.0.0.18
www CNAME websrv
vim /var/named/chenqizhi.org.zone.sh
$TTL 1D
@ IN SOA master admin.chenqizhi.org. ( 20230820 180 10M 1D 6H )
NS master
master A 20.0.0.8
websrv A 172.16.0.18
www CNAME websrv
vim /var/named/chenqizhi.org.zone.other
$TTL 1D
@ IN SOA master admin.chenqizhi.org. ( 20230820 180 10M 1D 6H )
NS master
master A 20.0.0.8
websrv A 127.0.0.1
www CNAME websrv
chgrp named /var/named/chenqizhi.org.zone.sz
chgrp named /var/named/chenqizhi.org.zone.sh
chgrp named /var/named/chenqizhi.org.zone.other
systemctl start named #第一次启动服务
rndc reload #不是第一次启动服务
实现位于不同区域的三个WEB服务器
#分别在三台主机上安装http服务
#在web服务器1:20.0.0.8/24实现
yum install httpd
echo 'hostname -I' > /var/www/html/index.html
systemctl start httpd
#在web服务器2:20.0.0.18/24
echo 'hostname -I' > /var/www/html/index.html
systemctl start httpd
#在web服务器3:172.16.0.18/16
yum install httpd
echo 'hostname -I' > /var/www/html/index.html
systemctl start httpd
客户端测试
#分别在两台主机上访问
#DNS客户端1:20.0.0.28/24 实现,确保DNS指向解析出sz web服务器地址
[root@localhost ~]# curl www.chenqizhi.org
20.0.0.18
#DNS客户端2:172.16.0.28/16 实现,确保DNS指向解析出sh web服务器地址
[root@localhost ~]# curl www.chenqizhi.org
20.0.0.58 172.16.0.18
解释DNS解析流程
(1)客户机发出请求解析域名www.google.com的报文
(2)本地的域名服务器收到请求后, 查询本地缓存, 假设没有该纪录, 则本地域名服务器10.1.1.1则向根域名服务器发出请求解析域名www.google.com
(3)根域名服务器收到请求后查询本地记录得到如下结果:google.com NS dns.google.com (表示google.com域中的域名服务器为:dns.google.com ), 同时给出dns.google.com的地址,并将结果返回给域名服务器10.1.1.1
(4)域名服务器10.1.1.1 收到回应后,再发出请求解析域名www.google.com的报文.
(5)域名服务器10.1.1.1收到请求后,开始查询本地的记录,找到如下一条记录:www.google.com A 64.233.189.104(表示google.com域中域名服务器dns.google.com的IP地址为:64.233.189.104),并将结果返回给客户本地域名服务器10.1.1.1
(6)客户本地域名服务器将返回的结果保存到本地缓存,同时将结果返回给客户机.
iptables 5表5链解释
iptables的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者经该设备转发、路由时,都可以使用iptables进行控制。
五表:
filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
nat:network address translation 地址转换规则表
mangle:修改数据标记位规则表
raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
五链:
INPUT, 进内核(包含:filter,mangle)
OUTPUT, 出内核(包含:filter,nat,mangle,raw)
FORWARD, 转发(包含:filter,mangle)
PREROUTING,前置路由检查(包含:nat,mangle,raw)
POSTROUTING 后置路由检查(包含:nat,mangle,raw)
三种报文:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING
iptables/firewalld/nftable 实现主机防火墙。5000-6000端口仅192.168.0.0/24网段内的主机访问
iptables:
iptables -A INPUT 192.168.0.0/24 -p tcp -m multiport --dports 5000:6000 -j ACCEPT
firewalld:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.0/24" port protocol="tcp" port="5000:6000" accept"
nftable:
nft add rule ip filter INPUT ip saddr 192.168.0.0/24 tcp dport {5000-6000} ct state new,established counter accept
mysql的各发行版有哪些 ?
1. MySQL 5.5
MySQL 5.5是MySQL 5.x系列中的一个版本。该版本于2010年底推出。MySQL 5.5的主要目的是提高性能和稳定性。以提高多核CPU的利用率、改进查询执行时间、提高InnoDB存储引擎的性能为重点。
2. MySQL 5.6
MySQL 5.6是MySQL 5.x系列中的一个版本。该版本于2013年初推出。MySQL 5.6主要改进了InnoDB和存储过程。它还增加了一些新的功能和特性,包括前缀索引、Memcached API和InnoDB表压缩等。
例如,下面是MySQL 5.6中新加的一些参数:
– binlog_checksum:用于启用/禁用二进制日志校验和。
– thread_handling:可配置线程池的行为。
– log_slow_rate_limit:设置慢查询日志的速率限制。
3. MySQL 5.7
MySQL 5.7是MySQL 5.x系列中的一个版本。该版本于2015年推出。MySQL 5.7引入了新的JSON数据类型,改进了GIS功能,支持全文索引,加强了安全性,提高了性能。
MySQL 5.7的新特性包括:
– 消除了MSISAM存储引擎,并使用InnoDB作为默认存储引擎。
– 增加了NO_ZERO_DATE和NO_ZERO_IN_DATE设置。
– 允许使用MySQL Connector/Python新的X DevAPI和X Plugin的Python API。
– 增加在线重做日志文件。
4. MySQL 8.0
MySQL 8.0是MySQL 6.x系列中的一个版本。该版本于2018年推出。MySQL 8.0引入了一些新功能和改进。例如,增加了支持IPv6、在线数据定义语言(DDL)操作、全球事物ID(GTID)、数据字典等。
MySQL 8.0的新特性包括:
– 增加了window函数和common table表达式。
– 增加了rudderless replication。
– 改进了锁策略以提高并发性能。
– 增加了对云平台的支持。
mysql索引的作用
索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键key,索引通过存储引擎实现.
·索引可以降低服务需要扫描的数据量,减少了IO次数
·索引可以帮助服务器避免排序和使用临时表
·索引可以帮助将随机I/O转为顺序I/0
mysql btree索引的原理
二叉树导致树高度非常高,逻辑上很近的节点,物理上非常远,无法利用局部性,IO 次数多,查找效率低
Btree是一种平衡的m-way查找树,它可以利用多个分支节点(子树节点)来减少查询数据时所经历的节点数,从而达到节省存取时间的目的。m称为B-Tree的度。
B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。
特点
有一个根节点,根节点只有一个记录和两个孩子或者根节点为空;
每个节点记录中的key和指针相互间隔,指针指向孩子节点;
d是表示树的宽度,除叶子节点之外,其它每个节点有[d/2,d-1]条记录,并且些记录中的key都是从左到右按大小排列的,有[d/2+1,d]个孩子;
在一个节点中,第n个子树中的所有key,小于这个节点中第n个key,大于第n-1个key;
所有的叶子节点必须在同一层次,也就是它们具有相同的深度;
由于B-Tree的特性,在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。
mysql安全加固?
一、更改默认端口
yf文件中修改端口号,并且在防火墙中开放该端口。
二、创建强密码
MySQL的安全性取决于账户和密码的安全性。我们需要创建强密码来保护MySQL。强密码应该包含大小写字母、数字和特殊字符,并且长度不少于8位。
三、限制远程访问
yfd-address参数,以限制只能在本地访问MySQL。如果需要远程访问MySQL,则应该使用SSH隧道或VPN来进行安全访问。
四、限制权限
MySQL的权限控制非常重要,因为它可以确保只有授权用户才能访问和修改数据库。我们需要限制权限,只授予必要的权限。可以使用GRANT和REVOKE命令来管理MySQL的权限。
五、定期备份
ysqldump命令来备份MySQL数据库,并将备份文件保存在安全的地方。
六、更新MySQL版本
综上所述,对MySQL进行安全加固需要更改默认端口、创建强密码、限制远程访问、限制权限、定期备份和更新MySQL版本。通过这些措施可以提高MySQL的安全性,防止数据泄露和攻击。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异