1 Firewalld防火墙企业实战
从CentOS7开始,默认是没有iptables的,而使用了firewall防火墙,FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。
什么是动态防火墙,跟iptables有什么区别呢,iptables service 管理防火墙规则的模式:用户将新的防火墙规则添加进/etc/sysconfig/iptables 配置文件当中,再执行命令 service iptables reload 使变更的规则生效。
整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。
哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。
Firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。
1.1 Firewalld区域剖析
Firewalld将网卡对应到不同的区域(zone),zone 默认共有9个,block dmz drop external home internal public trusted work.
不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public.
在最新版本的fedora(fedora21)当中随着 server 版和 workstation 版的分化则添加了两个不同的自定义 zone FedoraServer 和 FedoraWorkstation 分别对应两个版本。
1)列出Firewalld所有支持的Zone 和查看当前的默认Zone,操作指令如下:
[root@www-jfedu-net ~]# firewall-cmd --get-zones block dmz drop external home internal public trusted work [root@www-jfedu-net ~]# firewall-cmd --get-default-zone public |
2)Firewalld区域(zone),说明如下:
n iptables service 在 /etc/sysconfig/iptables 中储存配置;
n firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里;
n /etc/firewalld/的区域设定是一系列可以被快速执行到网络接口的预设定。
3)Firewalld防火墙Zone列表并简要说明如下:
drop(丢弃) 任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。 block(限制) 任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。 public(公共) 在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。 external(外部) 特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。 dmz(非军事区) 用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。 work(工作) 用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。 home(家庭) 用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。 internal(内部) 用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。 trusted(信任) 可接受所有的网络连接。 指定其中一个区域为默认区域是可行的。当接口连接加入了 NetworkManager,它们就被分配为默认区域。安装时,firewalld 里的默认区域被设定为公共区域。 |
1.2 Firewalld服务剖析
在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等. 与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70+ 种服务供我们使用. 当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中. service 配置的好处显而易见: 第一,通过服务名字来管理规则更加人性化, 第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。 |
每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:
[root@www-jfedu-net ~]# firewall-cmd --get-services RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https [root@www-jfedu-net ~]# firewall-cmd --list-services dhcpv6-client ssh |
动态添加一条防火墙规则如下: 假设自定义的 ssh 端口号为 12222,使用下面的命令来添加新端口的防火墙规则:
firewall-cmd --add-port=12222/tcp --permanent
如果需要使规则保存到 zone 配置文件,则需要加参数 –permanent举例如下:
[root@www-jfedu-net zones]# firewall-cmd --add-port=12222/tcp
success
[root@www-jfedu-net zones]# cat /etc/firewalld/zones/public.xml
[root@www-jfedu-net zones]# firewall-cmd --add-port=12222/tcp --permanent
success
[root@www-jfedu-net zones]# cat /etc/firewalld/zones/public.xml
<?xml versinotallow="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<port protocol="tcp" port="12222"/>
</zone>
#注意:防火墙配置文件也可以手动修改,修改后记得重载,重载方法请看下文.
1.3 Firewalld必备命令
CentOS7.x Linux系统使用Firewalld防火墙,需要掌握常见的Firewalld指令,如下为Firewalld常见的指令和参数含义:
# 关闭firewalld [root@www-jfedu-net zones]# systemctl stop firewalld.service # 启动firewalld [root@www-jfedu-net zones]# systemctl start firewalld.service # 把firewalld加入到系统服务 [root@www-jfedu-net zones]# systemctl enable firewalld.service # 从系统服务移除 [root@www-jfedu-net zones]# systemctl disable firewalld.service rm '/etc/systemd/system/basic.target.wants/firewalld.service' rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service' # 查看firewalld状态 两种方法2选1即可 [root@www-jfedu-net zones]# firewall-cmd --state running [root@www-jfedu-net zones]# systemctl status firewalld firewalld.service - firewalld - dynamic firewall daemon # 以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:[root@www-jfedu-net ~]# firewall-cmd --reload Success # 以 root 身份输入以下信息,重新加载防火墙并中断用户连接,即丢弃状态信息: [root@www-jfedu-net ~]# firewall-cmd --complete-reload Success # 获取支持的区域(zone)列表 [root@www-jfedu-net zones]# firewall-cmd --get-zones block dmz drop external home internal public trusted work # 获取所有支持的服务 [root@www-jfedu-net zones]# firewall-cmd --get-services RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https # 获取所有支持的ICMP类型 [root@www-jfedu-net zones]# firewall-cmd --get-icmptypes destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded # 列出全部启用的区域的特性 [root@www-jfedu-net zones]# firewall-cmd --list-all-zones # 输出格式是: <zone> interfaces: <interface1> .. services: <service1> .. ports: <port1> .. forward-ports: <forward port1> .. icmp-blocks: <icmp type1> .. # 输出区域 <zone> 全部启用的特性。如果生略区域,将显示默认区域的信息。 firewall-cmd [–znotallow=<zone>] –list-all [root@www-jfedu-net zones]# firewall-cmd --list-all public (default, active) interfaces: eno16777736 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: [root@www-jfedu-net zones]# firewall-cmd --znotallow=work --list-all work interfaces: sources: services: dhcpv6-client ipp-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: # 获取默认区域的网络设置 [root@www-jfedu-net zones]# firewall-cmd --get-default-zone public # 设置默认区域 [root@www-jfedu-net zones]# firewall-cmd --set-default-znotallow=work success # 注意:流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。 # 获取活动的区域 [root@www-jfedu-net zones]# firewall-cmd --get-active-zones work interfaces: eno16777736 # 根据接口获取区域 firewall-cmd –get-zone-of-interface=<interface> [root@www-jfedu-net zones]# firewall-cmd --get-zone-of-interface=eno16777736 public ## 以下关于区域和接口的操作,可以根据实际情况修改. # 将接口增加到区域 firewall-cmd [--znotallow=<zone>] --add-interface=<interface> # 如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接口在重新加载后将重新应用。 # 修改接口所属区域 firewall-cmd [--znotallow=<zone>] --change-interface=<interface> # 这个选项与 –add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接口将被添加到新的区域。 # 从区域中删除一个接口 firewall-cmd [--znotallow=<zone>] --remove-interface=<interface> # 查询区域中是否包含某接口 firewall-cmd [--znotallow=<zone>] --query-interface=<interface> # 注意:返回接口是否存在于该区域。没有输出。 # 列举区域中启用的服务 firewall-cmd [ --znotallow=<zone> ] --list-services # 这两条简单点说,就是断网和连网. # 启用应急模式阻断所有网络连接,以防出现紧急状况 firewall-cmd --panic-on # 禁用应急模式 firewall-cmd --panic-off # 查询应急模式 firewall-cmd --query-panic # 启用区域中的一种服务 firewall-cmd [--znotallow=<zone>] --add-service=<service> [--timeout=<seconds>] # 此举启用区域中的一种服务。如果未指定区域,将使用默认区域。如果设定了超时时间,服务将只启用特定秒数。如果服务已经活跃,将不会有任何警告信息。 # 例: 使区域中的 ipp-client 服务生效60秒: firewall-cmd --znotallow=home --add-service=ipp-client --timeout=60 # 例: 启用默认区域中的http服务: firewall-cmd --add-service=http # 禁用区域中的某种服务 firewall-cmd [--znotallow=<zone>] --remove-service=<service> # 此举禁用区域中的某种服务。如果未指定区域,将使用默认区域。 # 例: 禁止 home 区域中的 http 服务: firewall-cmd --znotallow=home --remove-service=http # 区域种的服务将被禁用。如果服务没有启用,将不会有任何警告信息。 # 查询区域中是否启用了特定服务 firewall-cmd [--znotallow=<zone>] --query-service=<service> # 如果服务启用,将返回1,否则返回0。没有输出信息。 # 启用区域端口和协议组合 firewall-cmd [--znotallow=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>] # 此举将启用端口和协议的组合。端口可以是一个单独的端口 <port> 或者是一个端口范围 <port>-<port> 。协议可以是 tcp 或 udp。 # 禁用端口和协议组合 firewall-cmd [--znotallow=<zone>] --remove-port=<port>[-<port>]/<protocol> # 查询区域中是否启用了端口和协议组合 firewall-cmd [--znotallow=<zone>] --query-port=<port>[-<port>]/<protocol> # 如果启用,此命令将有返回值。没有输出信息。 # 启用区域中的 IP 伪装功能 firewall-cmd [--znotallow=<zone>] --add-masquerade # 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。 # 禁用区域中的 IP 伪装 firewall-cmd [--znotallow=<zone>] --remove-masquerade # 查询区域的伪装状态 firewall-cmd [--znotallow=<zone>] --query-masquerade # 如果启用,此命令将有返回值。没有输出信息。 # 启用区域的 ICMP 阻塞功能 firewall-cmd [--znotallow=<zone>] --add-icmp-block=<icmptype> # 此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文,以及错误应答。 # 禁止区域的 ICMP 阻塞功能 firewall-cmd [--znotallow=<zone>] --remove-icmp-block=<icmptype> # 查询区域的 ICMP 阻塞功能 firewall-cmd [--znotallow=<zone>] --query-icmp-block=<icmptype> # 如果启用,此命令将有返回值。没有输出信息。 # 例: 阻塞区域的响应应答报文: firewall-cmd --znotallow=public --add-icmp-block=echo-reply # 在区域中启用端口转发或映射 firewall-cmd [--znotallow=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } # 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。 # 禁止区域的端口转发或者端口映射 firewall-cmd [--znotallow=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } # 查询区域的端口转发或者端口映射 firewall-cmd [--znotallow=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } # 如果启用,此命令将有返回值。没有输出信息。 # 例: 将区域 home 的 ssh 转发到 127.0.0.2 firewall-cmd --znotallow=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2 |
1.4 Firewalld永久设置
Firewalld永久选项不直接影响运行时的状态。这些选项仅在重载或者重启服务时可用。为了使用运行时和永久设置,需要分别设置两者。 选项--permanent 需要是永久设置的第一个参数。操作指令如下:
# 获取永久选项所支持的服务。 firewall-cmd --permanent --get-services # 获取永久选项所支持的ICMP类型列表 firewall-cmd --permanent --get-icmptypes # 获取支持的永久区域 firewall-cmd --permanent --get-zones # 启用区域中的服务 firewall-cmd --permanent [--znotallow=<zone>] --add-service=<service> # 此举将永久启用区域中的服务。如果未指定区域,将使用默认区域。 # 禁用区域中的一种服务 firewall-cmd --permanent [--znotallow=<zone>] --remove-service=<service> # 查询区域中的服务是否启用 firewall-cmd --permanent [--znotallow=<zone>] --query-service=<service> # 如果服务启用,此命令将有返回值。此命令没有输出信息。 firewall-cmd --permanent --znotallow=home --add-service=ipp-client # 永久启用区域中的一个端口-协议组合 firewall-cmd --permanent [--znotallow=<zone>] --add-port=<port>[-<port>]/<protocol> # 永久禁用区域中的一个端口-协议组合 firewall-cmd --permanent [--znotallow=<zone>] --remove-port=<port>[-<port>]/<protocol> # 查询区域中的端口-协议组合是否永久启用 firewall-cmd --permanent [--znotallow=<zone>] --query-port=<port>[-<port>]/<protocol> # 如果服务启用,此命令将有返回值。此命令没有输出信息。 # 例: 永久启用 home 区域中的 https (tcp 443) 端口 firewall-cmd --permanent --znotallow=home --add-port=443/tcp # 永久启用区域中的伪装 firewall-cmd --permanent [--znotallow=<zone>] --add-masquerade # 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。 # 永久禁用区域中的伪装 firewall-cmd --permanent [--znotallow=<zone>] --remove-masquerade # 查询区域中的伪装的永久状态 firewall-cmd --permanent [--znotallow=<zone>] --query-masquerade # 如果服务启用,此命令将有返回值。此命令没有输出信息。 # 永久启用区域中的ICMP阻塞 firewall-cmd --permanent [--znotallow=<zone>] --add-icmp-block=<icmptype> # 此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文或错误应答报文。 # 永久禁用区域中的ICMP阻塞 firewall-cmd --permanent [--znotallow=<zone>] --remove-icmp-block=<icmptype> # 查询区域中的ICMP永久状态 firewall-cmd --permanent [--znotallow=<zone>] --query-icmp-block=<icmptype> # 如果服务启用,此命令将有返回值。此命令没有输出信息。 firewall-cmd --permanent --znotallow=public --add-icmp-block=echo-reply # 在区域中永久启用端口转发或映射 firewall-cmd --permanent [--znotallow=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } # 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。 # 永久禁止区域的端口转发或者端口映射 firewall-cmd --permanent [--znotallow=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } # 查询区域的端口转发或者端口映射状态 firewall-cmd --permanent [--znotallow=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } # 如果服务启用,此命令将有返回值。此命令没有输出信息。 firewall-cmd --permanent --znotallow=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2 ## 直接选项 firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args> # 为表 <table> 增加一个新链 <chain> 。 firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain> # 从表 <table> 中删除链 <chain> 。 firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain> # 查询 <chain> 链是否存在与表 <table>. 如果是,返回0,否则返回1. firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain> # 如果启用,此命令将有返回值。此命令没有输出信息。 # 获取用空格分隔的表 <table> 中链的列表。 firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table> # 为表 <table> 增加一条参数为 <args> 的链 <chain> ,优先级设定为 <priority>。 firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args> # 从表 <table> 中删除带参数 <args> 的链 <chain>。 firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args> # 查询 带参数 <args> 的链 <chain> 是否存在表 <table> 中. 如果是,返回0,否则返回1. firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args> # 如果启用,此命令将有返回值。此命令没有输出信息。 # 获取表 <table> 中所有增加到链 <chain> 的规则,并用换行分隔。 firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain> |
1.5 Firewalld配置文件实战
Firewalld防火墙系统本身已经内置了一些常用服务的防火墙规则,存放在/usr/lib/firewalld/services/。注意请勿修改/usr/lib/firewalld/services/(模板目录),只有 /etc/firewalld/services 的文件可以被编辑。
[root@www-jfedu-net ~]# ls /usr/lib/firewalld/services/ |
不通过Firewalld指令,直接修改配置文件,也可以实现端口限制和开发,例如开放80端口供外网访问http服务,操作方法和步骤如下:
1)将http.xml复制到/etc/firewalld/services/下面,以服务形式管理防火墙;
cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/ |
2)系统会优先去读取/etc/firewalld 里面的文件,读取完毕后,会去/usr/lib/firewalld/services/再次读取;
3)为了方便修改和管理,建议复制到/etc/firewalld。重新加载Firewalld服务即可。
firewall-cmd --reload |
1.6 IT运维安全概念&安全实战
1)IT运维安全包括哪些层面呢?网络层面、系统层面、软件层面、硬件层面;
n 硬件层面
IDC机房、服务器硬件、IT设备定期等,定期巡检,保证其正常、稳定的运行,以防止损坏、被盗、高温、防静电、电源等;
n 软件层面
Nginx、JAVA、PHP、MYSQL、WEB网站、业务系统等软件程序漏洞、BUG,对外访问权限、监听的端口、版本隐藏、软件权限控制、用户名和密码控制;
n 系统层面
操作系统自身版本、BUG漏洞、暴露的端口、服务、系统权限、roo用户、禁止ping、指令特权控制;
n 网络层面
大流量冲击、DDOS、ARP攻 ji、通信中断等,网络层面安全重点关注网络流量、网络连通性;
1.7 IT运维安全实战策略
1.7.1 用户名密码策略
1) 设置超复杂用户名和密码,密码定期修改,对系统安全深入的了解,需要先了解PAM认证,PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。
2) PAM提供动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要,给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。
3) PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux、SunOS、HP-UX 9.0等。PAM的配置是通过单个配置文件/etc/pam.conf。RedHat还支持另外一种配置方式,即通过配置目录/etc/pam.d/,且这种的优先级要高于单 个配置文件的方式。
4) Linux系统下,用户名和密码相关的文件详解如下:
n /etc/passwd
包含系统全部用户的信息,包括用户名,UID,GID,注释信息,用户家目录,用户shell类型;
n /etc/shadow
包含密码信息,以$为分隔符,$后第一段是密码加密机制,$后第二段为随机数,防止用户密码相同时,密文也是相同的,第三段才是真正的密码。后边分别是密码最近修改的天数,多少天后可以修改密码,密码过期时间,过期前多少天提醒,冻结期;
n /etc/group
记录系统上所有的组的信息。分别是组名,密码占位符,GID
n /etc/gshadow
记录系统上组的信息,以此组为附加组的用户的用户名;
5) Linux用户密码的有效期,是否可以修改密码可以通过login.defs文件控制.对login.defs文件修只影响后续建立的用户,可以改变用户的有效期等。
6) /etc/login.defs密码策略如下:
PASS_MAX_DAYS 99999 #密码的最大有效期, 99999:永久有期; |
7) 如何将Linux系统用户的密码设置一个安全、符合密码复杂度的密码而绞尽脑汁,Linux动态密码生成工具众多,此处使用动态密码生成工具(mkpasswd);
n mkpasswd 是Linux自带的一个密码生成工具,可以说是非常安全、可靠的,安装配置指令:yum -y install expect;
n mkpasswd参数和功能描述如下所示:
-l定义生成密码的长度,默认9; -d定义密码里面包含数字的最少个数,默认2; -c定义密码里面包含小写字母的最少个数,默认2; -C定义密码里面包含大写字母的最少个数,默认2; -s定义密码密码包含特殊字符的最少个数,默认1; |
8) 登出时间限制600退出时间&历史记录。
cp /etc/profile /etc/profile.bak echo export TMOUT=600 >>/etc/profile #增加10分钟超时退出 echo export HISTTIMEFORMAT=\'%F %T `whoami` \' >> /etc/profile #记录操作历史记录的时间 echo export HISTFILESIZE=10000 >> /etc/profile echo export HISTSIZE=10000 >> /etc/profile source /etc/profile |
9) 锁定关键文件系统,防止黑客恶意修改
chattr +i /etc/passwd chattr +i /etc/inittab chattr +i /etc/group chattr +i /etc/shadow chattr +i /etc/gshadow |
1.7.2 启用Sudo超级特权
CentOS Linux的默认管理员名即是root,只需要知道ROOT密码即可直接登录SSH。禁止Root从SSH直接登录可以提高服务器安全性。
n 配置Sudo用户权限;
Cmnd_Alias ADMPW = /usr/bin/*, /usr/sbin/*, /sbin/*, /bin/*, /usr/local/sbin/*, !/usr/bin/passwd, !/usr/bin/passwd root admin ALL=(ALL) NOPASSWD: ADMPW |
n 禁止Root登录配置方法:
sed -i '/PermitRootLogin/s/yes/no/g' /etc/ssh/sshd_config |
n 重启sshd服务;
service sshd restart |
n 修改sshd默认端口,将22端口修改为60022;
sed '/^#Port/s/#//g;s/22/60022/g' /etc/ssh/sshd_config service sshd restart |
1.7.3 关闭服务和端口
chkconfig ip6tables off >/dev/null 2>&1 chkconfig rpcidmapd off >/dev/null 2>&1 chkconfig apmd off >/dev/null 2>&1 chkconfig arptables_jf off >/dev/null 2>&1 chkconfig --level 2345 cups off >/dev/null 2>&1 chkconfig --level 2345 xfs off >/dev/null 2>&1 chkconfig --level 2345 lm_sensors off >/dev/null 2>&1 chkconfig gpm off >/dev/null 2>&1 chkconfig --level 2345 autofs off >/dev/null 2>&1 chkconfig --level 2345 acpid off >/dev/null 2>&1 chkconfig --level 2345 sendmail off >/dev/null 2>&1 chkconfig --level 2345 cups-config-daemon off >/dev/null 2>&1 chkconfig openibd off >/dev/null 2>&1 chkconfig iiim off >/dev/null 2>&1 chkconfig pcmcia off >/dev/null 2>&1 chkconfig cpuspeed off >/dev/null 2>&1 chkconfig nfslock off >/dev/null 2>&1 chkconifg microcode_ctl off >/dev/null 2>&1 chkconfig rpcgssd off >/dev/null 2>&1 chkconfig NetworkManager off >/dev/null 2>&1 |
1.7.4 服务监听控制
在企业生产环境,很多核心服务只需要本机内部访问,无需外部主机访问,此时服务监听的网卡地址,尽量使用127.0.0.1监听,不要使用0.0.0.0全网地址。
因为0.0.0.0指的是本地机器上的所有网卡,例如本地服务器有两块网卡,如果用0.0.0.0绑定80,那么本地两块网卡都监听了80端口,而且也包括127.0.0.1回环网卡。 简而言之,0.0.0.0绑定可以从本地和远程进行服务,而使用127.0.0.1从其他计算机上是无法访问到本地服务的。
1.7.5 远程登录服务器
远程连接Linux操作系统时,通常使用的Linux SSH登录方式是通过用户名+密码,如果密码被黑客获取,或者遗漏会影响服务器安全,此时我们可以使用密钥文件登录。
SSH登录是用的RSA非对称加密的,所以我们在SSH登录的时候就可以使用RSA密钥登录,SSH有专门创建密钥文件工具Ssh-keygen。
1.7.6 引入防火墙
防火墙是什么呢?可以做隔离,防止意外产生,对于IT领域,防火墙主要用于对数据包做过滤,可以实现用户访问控制,通过设置IP和端口访问规则,可以对数据包进行过滤和限制,从而可以提供业务访问安全。
1.7.7 版本漏洞&补丁
Linux内核不定期会更新,很多操作系统基于老的内核版本,老的内核版本或者系统会存在一些漏洞和风险,作为运维人员要定期检测Linux系统版本漏洞,及时打补丁,定期升级稳定版本,从而提高Linux服务器的安全性。