马哥教育Linux-第05周作业

学号:N74058

1. 总结openssh服务安全加固

OpenSSH服务安全加固主要包括以下几个方面:
1、禁用不安全的加密算法:在sshd_config文件中禁用不安全的加密算法,如DES和RC4等,建议只使用AES和ChaCha20等安全加密算法。
2、限制用户登录:可以通过修改sshd_config文件中的AllowUsers或DenyUsers选项来限制哪些用户可以登录,也可以使用PAM模块限制用户登录。
3、使用强密码策略:可以通过修改sshd_config文件中的PasswordAuthentication选项来启用强密码策略,建议设置密码最小长度、密码复杂度等。
4、防止暴力破解:可以通过修改sshd_config文件中的MaxAuthTries选项来限制用户登录失败的次数,也可以使用Fail2ban等软件来防止暴力破解。
5、使用公钥认证:使用公钥认证可以减少密码泄露的风险,建议禁用密码认证并启用公钥认证。
6、修改SSH默认端口:将SSH默认端口修改为非常用端口,可以减少暴力破解的风险。
7、定期更新OpenSSH版本:及时更新OpenSSH版本可以修复安全漏洞和提升安全性能。
8、配置防火墙:使用防火墙可以限制SSH服务的访问范围,只允许必要的IP地址访问SSH服务端口。

2. 总结sudo配置文件格式,总结相关示例。

sudo配置文件是/etc/sudoers,它包含了用户和用户组对于系统资源的访问权限。其格式如下:
user1 host1=(user2) command1, command2, ...
%group1 host2=(user3) command3, command4, ...

其中,user1和%group1是需要授权的用户和用户组,host1和host2表示授权的主机名,user2和user3是需要切换到的用户,command1、command2、command3等是可以执行的命令。其中,host、user、command都可以使用ALL表示所有主机、用户、命令。
示例1:授权用户sudo执行所有命令
sudo ALL=(ALL) ALL

示例2:授权用户sudo执行指定命令
user1 ALL=(root) /usr/bin/apt-get, /usr/bin/yum

示例3:授权用户组sudoers执行指定命令
%admin ALL=(ALL) /usr/bin/passwd, /usr/sbin/useradd, /usr/sbin/userdel

示例4:允许用户sudo在授权期内无需输入密码
user1 ALL=(root) NOPASSWD: /usr/bin/apt-get, /usr/bin/yum

注意,在修改sudo配置文件时,最好使用visudo命令进行修改,避免出现语法错误导致无法sudo的情况。

3. 总结PAM架构及工作原理

PAM(Pluggable Authentication Modules,可插拔身份验证模块)是一个用于身份验证的系统架构,它允许系统管理员在不修改应用程序的情况下更改身份验证方法。它可以在Linux、Unix等操作系统中使用,并且为各种应用程序提供了一致的身份验证机制。
PAM架构包含以下四个组件:
1、应用程序:需要身份验证的应用程序。
2、PAM库:提供身份验证机制的库。
3、PAM配置文件:指定身份验证规则的配置文件。
4、身份验证模块:实现身份验证规则的模块。 

PAM的工作原理如下:
1、当应用程序需要进行身份验证时,它会调用PAM库中的相应函数。
2、PAM库根据应用程序所提供的服务名称在PAM配置文件中查找相应的配置信息。
3、PAM库根据PAM配置文件中的配置信息调用相应的身份验证模块。
4、身份验证模块根据PAM配置文件中的配置信息进行身份验证,并返回成功或失败的结果。
5、PAM库根据身份验证模块的返回结果决定身份验证是否成功,如果成功则返回成功结果给应用程序,否则返回失败结果给应用程序。
6、PAM的优点在于它可以根据需要灵活地定制身份验证规则,并且支持各种身份验证方法,例如密码、指纹、智能卡等。同时,通过使用PAM,系统管理员可以更容易地管理身份验证规则,提高系统的安全性。

4. 总结PAM配置文件格式,总结相关示例, nologin.so, limits,等模块的使用。

PAM配置文件是/etc/pam.d目录下的文件,每个文件对应一个应用程序或服务。其格式如下:
type control module-path module-arguments
其中,type表示PAM模块的类型,包括auth、account、password、session等。control表示控制标记,包括required、requisite、sufficient、optional等。module-path表示PAM模块的路径,module-arguments表示PAM模块的参数。
以下是几个常用的PAM模块及示例:
pam_nologin.so:禁止非特权用户登录系统。
auth required pam_nologin.so
pam_limits.so:设置用户资源限制。
session required pam_limits.so
pam_unix.so:验证用户密码。
auth required pam_unix.so sha512 shadow nullok
pam_env.so:设置环境变量。
session required pam_env.so user_readenv=1
pam_securetty.so:限制root用户登录控制台。
auth requisite pam_securetty.so
在PAM配置文件中,控制标记的作用是指定PAM模块的验证顺序和返回结果。其中,required表示如果PAM模块验证失败,则整个验证过程将失败;requisite表示如果PAM模块验证失败,则整个验证过程立即失败,不再执行后面的PAM模块;sufficient表示如果PAM模块验证成功,则整个验证过程立即成功,不再执行后面的PAM模块;optional表示如果PAM模块验证失败,不会导致整个验证过程失败,但是如果验证成功,则需要继续执行后面的PAM模块。
使用PAM模块可以实现各种身份验证和授权规则,例如限制用户资源使用、设置环境变量、限制特定用户登录控制台等。

5. 实现私有时间服务器
服务端10.0.0.150

[root@Server ~]# yum install chrony -y
[root@Server ~]# 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.ntp.org.cn iburst
server ntp.aliyun.com iburst
server ntp.tencent.com iburst
server time.windows.com iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Serve time even if not synchronized to a time source.
#local stratum 10

# Specify file containing keys for NTP authentication.
#keyfile /etc/chrony.keys

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking
[root@Server ~]# systemctl start chronyd
[root@Server ~]# systemctl enable chronyd
[root@Server ~]# date
Tue Mar 21 20:19:10 CST 2023
[root@Server ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:a3:66:fc brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.150/24 brd 10.0.0.255 scope global noprefixroute dynamic ens32
       valid_lft 1379sec preferred_lft 1379sec
    inet6 fe80::c926:f89:81dd:6365/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever 

客户端10.0.0.139

[root@client ~]# yum install chrony -y
[root@client ~]# 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 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
server 10.0.0.150 iburst
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Serve time even if not synchronized to a time source.
#local stratum 10

# Specify file containing keys for NTP authentication.
#keyfile /etc/chrony.keys

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking
[root@client ~]# systemctl restart chronyd
[root@client ~]# systemctl enable chronyd
[root@client ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:12:bb:54 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.139/24 brd 10.0.0.255 scope global noprefixroute dynamic ens32
       valid_lft 1190sec preferred_lft 1190sec
    inet6 fe80::c926:f89:81dd:6365/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::af6e:776b:812d:4e19/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

6. 总结DNS域名三级结构

DNS(Domain Name System)是一种分层、分布式的命名系统,用于将IP地址和易于记忆的域名相互映射。DNS域名通常采用三级结构,包括顶级域、二级域和三级域。以下是DNS域名三级结构的总结:
1、顶级域名(Top-Level Domain,TLD):顶级域名是一个域名的最高层次,通常表示一个国家、地区或组织类型。例如,.com表示商业组织,.org表示非赢利组织,.edu表示教育机构,.cn表示中国等。顶级域名还可以分为两种类型:国家顶级域名(Country-Code Top-Level Domain,ccTLD)和通用顶级域名(Generic Top-Level Domain,gTLD)。
2、二级域名(Second-Level Domain,SLD):二级域名是紧接在顶级域名后面的域名部分,用于区分不同的组织或实体。例如,在“.com”顶级域名下,“baidu”就是一个二级域名,“baidu.com”就是一个完整的域名。
3、三级域名(Third-Level Domain):三级域名是紧接在二级域名后面的域名部分,通常用于进一步区分不同的部门、区域或主机名。例如,在“baidu.com”二级域名下,“www”可以是一个三级域名,“www.baidu.com”就是一个完整的域名。
DNS域名的三级结构可以提供更加灵活和可扩展的命名系统,使得不同的组织和实体可以通过自定义域名来展示自己的品牌和身份。同时,DNS域名的三级结构也提高了命名系统的可读性和易用性,使得用户可以更加方便地记忆和使用域名。

7. 总结DNS服务工作原理,涉及递归和迭代查询原理

DNS(Domain Name System)是一种分布式的命名系统,用于将易于记忆的域名映射为IP地址,以便于网络通信。DNS服务工作原理可以概括为以下几个步骤:
1、用户在浏览器中输入域名,如www.baidu.com。
2、浏览器向本地DNS服务器发送DNS查询请求。
3、如果本地DNS服务器已经缓存了该域名对应的IP地址,则直接返回给浏览器。
4、如果本地DNS服务器没有缓存该域名对应的IP地址,则向根域名服务器发送递归查询请求。
5、根域名服务器返回给本地DNS服务器该域名对应的顶级域名服务器的IP地址。
6、本地DNS服务器向顶级域名服务器发送迭代查询请求。
7、顶级域名服务器返回给本地DNS服务器该域名对应的二级域名服务器的IP地址。
8、本地DNS服务器向二级域名服务器发送迭代查询请求。
9、二级域名服务器返回给本地DNS服务器该域名对应的主机名的IP地址。
10、本地DNS服务器将IP地址返回给浏览器,并将该域名和IP地址缓存起来。
递归查询和迭代查询是DNS服务中的两种查询方式。递归查询是指DNS服务器向其他DNS服务器发出查询请求,并要求对方返回查询结果,如果对方不能返回结果,则向更高级别的DNS服务器发出查询请求,直到获取到查询结果为止。在上述工作原理中,本地DNS服务器向根域名服务器发出的查询请求就是一种递归查询。
迭代查询是指DNS服务器向其他DNS服务器发出查询请求,对方返回自己所知道的信息,如果对方不能返回查询结果,则DNS服务器需要向其他DNS服务器继续发出查询请求,直到获取到查询结果为止。在上述工作原理中,本地DNS服务器向顶级域名服务器和二级域名服务器发出的查询请求就是一种迭代查询。
总之,DNS服务通过递归和迭代查询,以及DNS服务器之间的协作,实现了域名和IP地址之间的映射,从而支持了互联网上的各种网络应用。

8. 实现私有DNS, 供本地网络主机作DNS递归查询。

[root@server ~]# yum install bind bind-utils -y
[root@server ~]# vim /etc/named.conf
acl trusted {
    10.0.0.0/24;
    localhost;
    localnets;
};
options {
    directory "/var/named";
    recursion yes;
    allow-query { trusted; };
    allow-transfer { none; };
    allow-recursion { trusted; };
    listen-on port 53 { 127.0.0.1; 10.0.0.150; };
    listen-on-v6 port 53 { ::1; };
    forwarders { 180.76.76.76; 119.29.29.29; };
    dnssec-validation no;
    dnssec-enable yes;
    dnssec-lookaside auto;
};
zone "." IN {
    type hint;
    file "named.ca";
};

[root@server ~]# mkdir /var/named/zones
[root@server ~]# vim /var/named/zones/cuixuanguo.com
$TTL 86400
@ IN SOA dns.cuixuanguo.com. root.cuixuanguo.com. (
    2019010101 ; Serial
    3600 ; Refresh
    1800 ; Retry
    604800 ; Expire
    86400 ; Minimum TTL
)
@ IN NS dns.cuixuanguo.com.
dns IN A 10.0.0.150
host1 IN A 10.0.0.139
host2 IN A 10.0.0.140

[root@server ~]# vim /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 10.0.0.150

[root@server ~]# systemctl enable named && systemctl start named
[root@server ~]# nslookup host1.cuixuanguo.com
Server:		10.0.0.150
Address:	10.0.0.150#53

** server can't find host1.cuixuanguo.com: NXDOMAIN

9. 总结DNS服务器类型,解析答案,正反解析域,资源记录定义。

DNS服务器类型:
1. 递归型:负责查询其他DNS服务器,并返回请求者所需的数据
2. 迭代型:只回答自己知道的信息,将请求进一步转发给其他DNS服务器
3. 缓存型:缓存已查询过的域名解析结果,以便加快后续相同请求的响应速度 

DNS服务器通过查询不同级别的域名服务器来获取解析结果并返回给客户端。如果本地区域没有找到该主机记录,则会向较高层次上游查询。
正反向解析域:
正向解析就是根据主机名(如www.baidu.com)查找对应IP地址。
反向解析是根据IP

10. 实现DNS主从同步
DNS主:192.168.41.148

[root@Master ~]# yum install bind bind-utils -y
[root@Master ~]# vim /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

options {
	listen-on port 53 { 192.168.41.148; };
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
	statistics-file "/var/named/data/named_stats.txt";
	memstatistics-file "/var/named/data/named_mem_stats.txt";
	recursing-file  "/var/named/data/named.recursing";
	secroots-file   "/var/named/data/named.secroots";
	allow-query     { 192.168.41.0/24; };
        allow-transfer  { 192.168.41.0/24; };

	/* 
	 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
	 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
	   recursion. 
	 - If your recursive DNS server has a public IP address, you MUST enable access 
	   control to limit queries to your legitimate users. Failing to do so will
	   cause your server to become part of large scale DNS amplification 
	   attacks. Implementing BCP38 within your network would greatly
	   reduce such attack surface 
	*/
	recursion yes;

	dnssec-enable yes;
	dnssec-validation yes;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.root.key";

	managed-keys-directory "/var/named/dynamic";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "cui.com" IN {
	type master;
	file "cui.zone";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

[root@Master ~]# cd /var/named/
[root@Master named]# vim cui.zone
$TTL 1D
@           IN         SOA     dns1.cui.com.   admin.cui.com  ( 0 
                                                   1D
                                                   1H
                                                   1W
                                                   3H )
            IN         NS      dns1.cui.com.
            IN         NS      dns2.cui.com.
            IN         MX   10 mail.cui.com.
dns1        IN         A       192.168.41.148
dns2        IN         A       192.168.41.191
fileserver  IN         A       172.16.0.100
printserver IN         A       172.16.0.101
www         IN         A       172.16.0.200
www         IN         A       172.16.0.201
mail        IN         A       172.16.0.25
ntp         IN         A       172.16.0.22

[root@Master named]# systemctl enable named && systemctl start named

DNS从:192.168.41.191

[root@Slave ~]# yum install bind bind-utils -y
[root@Slave ~]# vim /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

options {
	listen-on port 53 { 192.168.41.191; };
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
	statistics-file "/var/named/data/named_stats.txt";
	memstatistics-file "/var/named/data/named_mem_stats.txt";
	recursing-file  "/var/named/data/named.recursing";
	secroots-file   "/var/named/data/named.secroots";
	allow-query     { 192.168.41.0/24; };

	/* 
	 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
	 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
	   recursion. 
	 - If your recursive DNS server has a public IP address, you MUST enable access 
	   control to limit queries to your legitimate users. Failing to do so will
	   cause your server to become part of large scale DNS amplification 
	   attacks. Implementing BCP38 within your network would greatly
	   reduce such attack surface 
	*/
	recursion yes;

	dnssec-enable yes;
	dnssec-validation yes;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.root.key";

	managed-keys-directory "/var/named/dynamic";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "cui.com" IN {
	type slave;
	file "slaves/cui.zone";
        masters { 192.168.41.148; };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

[root@Slave ~]# systemctl enable named && systemctl start named
[root@Slave ~]# ll /var/named/slaves/
total 4
-rw-r--r-- 1 named named 517 Mar 22 10:32 cui.zone

11. 实现DNS子域授权

[root@localhost ~]# yum install bind bind-utils -y
[root@localhost ~]# vim /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html

options {
	listen-on port 53 { 192.168.41.191; };
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
	statistics-file "/var/named/data/named_stats.txt";
	memstatistics-file "/var/named/data/named_mem_stats.txt";
	recursing-file  "/var/named/data/named.recursing";
	secroots-file   "/var/named/data/named.secroots";
	allow-query     { any; };

	/* 
	 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
	 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
	   recursion. 
	 - If your recursive DNS server has a public IP address, you MUST enable access 
	   control to limit queries to your legitimate users. Failing to do so will
	   cause your server to become part of large scale DNS amplification 
	   attacks. Implementing BCP38 within your network would greatly
	   reduce such attack surface 
	*/
	recursion yes;

	dnssec-enable yes;
	dnssec-validation yes;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.root.key";

	managed-keys-directory "/var/named/dynamic";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "subdomain.cui.com" IN {
	type master;
	file "/var/named/subdomain.cui.com.zone";
        allow-update { none; };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

[root@localhost ~]# touch /var/named/subdomain.cui.com.zone
[root@localhost ~]# vim /var/named/subdomain.cui.com.zone
$TTL 86400
@   IN  SOA ns1.cui.com. admin.cui.com. (
                2021071501  ; Serial
                3600        ; Refresh
                1800        ; Retry
                604800      ; Expire
                86400       ; Minimum TTL
)
@   IN  NS  ns1.cui.com.
ns1 IN  A   192.168.41.191

[root@localhost ~]# systemctl enable named && systemctl restart named

12. 基于acl实现智能DNS

[root@localhost ~]# yum install bind bind-utils -y
[root@localhost ~]# vim /etc/named.conf 
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
acl "smartdns" {
     192.168.41.0/24;
};

options {
	listen-on port 53 { 192.168.41.191; };
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
	statistics-file "/var/named/data/named_stats.txt";
	memstatistics-file "/var/named/data/named_mem_stats.txt";
	recursing-file  "/var/named/data/named.recursing";
	secroots-file   "/var/named/data/named.secroots";
	allow-query     { smartdns; };
        allow-recursion { smartdns; };

	/* 
	 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
	 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
	   recursion. 
	 - If your recursive DNS server has a public IP address, you MUST enable access 
	   control to limit queries to your legitimate users. Failing to do so will
	   cause your server to become part of large scale DNS amplification 
	   attacks. Implementing BCP38 within your network would greatly
	   reduce such attack surface 
	*/
	recursion yes;

	dnssec-enable yes;
	dnssec-validation yes;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.root.key";

	managed-keys-directory "/var/named/dynamic";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
	type hint;
	file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

[root@localhost ~]# touch /var/named/cui.com.zone
[root@localhost ~]# vim /var/named/cui.com.zone
$TTL 86400
@   IN  SOA ns1.cui.com. admin.cui.com. (
                2021071501  ; Serial
                3600        ; Refresh
                1800        ; Retry
                604800      ; Expire
                86400       ; Minimum TTL
)
@   IN  NS  ns1.cui.com.
ns1 IN  A   192.168.41.191
www IN  A   192.168.41.148

[root@localhost ~]# systemctl enable named && systemctl restart named

13. 总结防火墙分类

防火墙是一种计算机网络安全设备,用于监视和控制进出网络的数据流。防火墙通常分为以下几类:
1、包过滤型防火墙
包过滤型防火墙是最早的防火墙之一,它基于网络数据包的源地址、目标地址、协议类型、端口号等信息来决定是否允许通过。包过滤型防火墙具有高效率、低延迟和低成本等优点,但它只能检查数据包的头部信息,而无法深入检查数据包的内容,容易被攻击者绕过。
2、应用层网关型防火墙
应用层网关型防火墙是一种基于应用层协议的防火墙,它可以深入检查数据包的内容,并根据应用层协议进行过滤和控制。应用层网关型防火墙具有高度的灵活性和安全性,但也存在效率较低和复杂度较高的问题。
3、状态检测型防火墙
状态检测型防火墙是一种基于连接状态的防火墙,它可以检测数据包的连接状态,如建立连接、保持连接和关闭连接等,并根据连接状态决定是否允许通过。状态检测型防火墙可以有效地防止一些特定的攻击,如拒绝服务攻击和网络蠕虫攻击等。
4、混合型防火墙
混合型防火墙将多种防火墙技术进行组合,以提高安全性和灵活性。混合型防火墙通常包括包过滤型防火墙、应用层网关型防火墙和状态检测型防火墙等多种技术,可以根据实际需求进行灵活配置。
总之,不同类型的防火墙各有优缺点,应根据实际需求和安全性要求选择适合的防火墙技术进行配置和使用。

14. 总结iptable 5表5链, 基本使用,扩展模块。

iptables是一种Linux系统下的防火墙软件,可以用于监控、过滤和修改数据包流量,以保护计算机网络的安全。iptables主要包括5个表和5个链,以及一些扩展模块。
1、五个表
filter表:默认使用该表,用于过滤数据包;
nat表:用于网络地址转换,如端口转发、源地址转换等;
mangle表:用于修改数据包的特定字段,如TTL、TOS、标记等;
raw表:用于禁止某些特定的数据包被进一步处理;
security表:用于安全框架SELinux的规则过滤。
2、五个链
INPUT链:用于处理输入数据包;
OUTPUT链:用于处理输出数据包;
FORWARD链:用于处理转发数据包;
PREROUTING链:用于处理数据包进入路由之前的工作;
POSTROUTING链:用于处理数据包离开路由之后的工作。
3、基本使用
查看iptables规则:iptables -L
清除iptables规则:iptables -F
设置默认规则:iptables -P [CHAIN] [target]
添加规则:iptables -A [CHAIN] [OPTIONS] [target]
删除规则:iptables -D [CHAIN] [OPTIONS] [target]
4、扩展模块
conntrack模块:用于跟踪连接状态;
limit模块:用于限制数据包流量;
mark模块:用于标记数据包;
REJECT模块:用于拒绝数据包;
LOG模块:用于记录数据包信息。
总之,iptables是一种功能强大的防火墙软件,可以使用五个表和五个链来监控、过滤和修改数据包流量,以及使用扩展模块来实现更复杂的功能。熟练掌握iptables的基本使用和扩展模块,可以帮助系统管理员更好地保护计算机网络的安全。

15. 总结iptables规则优化实践,规则保存和恢复。

为了优化iptables规则,可以采取以下实践:
1、尽量使用已有规则:可以使用已有规则,避免重复创建规则。
2、使用地址块:可以使用地址块来简化规则,减少重复。
3、使用扩展模块:可以使用扩展模块来实现更复杂的规则,如限制数据包流量、标记数据包、拒绝数据包、记录数据包信息等。
4、避免使用DROP规则:DROP规则会丢弃数据包,导致网络连接超时,建议使用REJECT规则。
5、避免使用ACCEPT规则:尽量使用默认策略,只开放必要的端口。
6、使用链来组织规则:可以使用链来组织规则,提高规则的可读性和可维护性。
7、避免使用通配符:尽量避免使用通配符,如0.0.0.0/0和::/0。
8、使用规则注释:可以使用注释来说明规则,提高规则的可读性。 

规则保存和恢复可以使用以下命令:
保存规则:iptables-save > /etc/sysconfig/iptables
恢复规则:iptables-restore < /etc/sysconfig/iptables
永久保存规则:service iptables save
总之,优化iptables规则可以提高网络安全性和性能,规则保存和恢复可以方便地管理iptables规则,避免规则丢失和重复创建。

16. 总结NAT转换原理, DNAT/SDNAT原理,并自行设计架构实现DNAT/SNAT。

NAT(Network Address Translation)是一种网络地址转换技术,可以将私有IP地址转换为公共IP地址,以实现内部网络和外部网络的通信。NAT转换原理如下:
1、SNAT(Source NAT):将私有IP地址转换为公共IP地址,以便内部网络能够访问外部网络。SNAT会修改数据包的源IP地址和源端口号,同时在NAT表中记录转换规则。
2、DNAT(Destination NAT):将公共IP地址转换为私有IP地址,以便外部网络能够访问内部网络。DNAT会修改数据包的目标IP地址和目标端口号,同时在NAT表中记录转换规则。DNAT和SNAT的原理是类似的,都是通过修改数据包的源或目标IP地址来实现网络地址转换。具体实现流程如下:
3、数据包到达NAT设备时,根据目标IP地址和目标端口号匹配NAT表中的转换规则。
4、如果匹配成功,NAT设备会根据转换规则修改数据包的源或目标IP地址和端口号。
5、如果匹配失败,NAT设备会将数据包转发到下一个设备。 

自行设计架构实现DNAT/SNAT可以采取以下步骤:
1、配置NAT设备的网络接口,如内部网络的接口和外部网络的接口。
2、配置NAT表,包括DNAT表和SNAT表,根据转换规则来修改数据包的源或目标IP地址。
3、配置转发规则,将符合条件的数据包转发到相应的网络接口。
4、测试NAT设备的功能,并根据需要进行优化和调整。
总之,NAT是一种重要的网络地址转换技术,可以将私有IP地址转换为公共IP地址,以实现内部网络和外部网络的通信。DNAT和SNAT是NAT的两种实现方式,可以通过修改数据包的源或目标IP地址来实现网络地址转换。

[root@localhost ~]# ip addr add 192.168.1.1/24 dev ens18
[root@localhost ~]# ip addr add 203.0.113.1/24 dev eth19
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@localhost ~]# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:80
[root@localhost ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.1
[root@localhost ~]# iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables  

17. 使用REDIRECT将90端口重定向80,并可以访问到80端口的服务

可以使用以下命令将90端口重定向到80端口:
iptables -t nat -A PREROUTING -p tcp --dport 90 -j REDIRECT --to-port 80
这个命令会将所有流量从90端口重定向到80端口。这种方法在需要将一个端口转发到另一个端口时非常有用。如果您有多个要重定向的端口,可以将上面的命令添加到shell脚本中,以便更容易地进行管理和维护。
请注意,为了使这个规则生效,您需要确保iptables服务正在运行,并且规则没有被其它的iptables规则覆盖或禁用。

18. firewalld常见区域总结。

firewalld是Linux系统中的一个防火墙管理器,它支持不同的防火墙区域来控制网络接口的访问。常见的防火墙区域包括:
1. public区域:适用于公共网络,如Internet。在这个区域中,所有入站流量都被禁止,除非在规则中添加显式允许的规则。
2. internal区域:适用于内部网络,如公司的局域网。在这个区域中,所有入站连接都是默认允许的,因此需要谨慎地添加规则以限制访问。
3. dmz区域:适用于半信任网络区域,通常用于放置Web服务器、邮件服务器等。在这个区域中,入站流量是允许的,但需要添加规则限制流量的范围和目的。
4. work区域:适用于工作场所网络,如办公室网络。该区域中入站流量默认是允许的,但需要添加规则限制访问。
5. home区域:适用于家庭网络,入站流量默认情况下是允许的,但需要添加规则限制访问。
6. trusted区域:适用于完全信任的网络。在这个区域中,所有入站和出站连接都是默认允许的,但还是需要添加规则以限制访问。
请注意,这些区域名称可能有所不同,具体取决于不同的Linux发行版或网络配置。

19. 通过ntftable来实现暴露本机80/443/ssh服务端口给指定网络访问

ntftables是Linux内核中的一个防火墙框架,它可以使用类似iptables的规则来控制网络流量。如果您想暴露本机80、443和SSH服务端口给指定网络访问,可以按照以下步骤操作:
1. 创建一个名为“allow_port”的ntftables表格,并在该表格中添加三个链:tcp80、tcp443和ssh。
ntfctable create allow_port nftables
nft add chain inet allow_port tcp80 { type filter hook input priority 0 ; }
nft add chain inet allow_port tcp443 { type filter hook input priority 0 ; }
nft add chain inet allow_port ssh { type filter hook input priority 0 ; } 

2. 分别在这三个链中添加规则,以允许来自指定IP地址或网络的流量通过。例如,假设您想允许来自192.168.0.0/24网络的流量,可以使用以下命令添加规则:
nft add rule inet allow_port tcp80 ip saddr 192.168.0.0/24 tcp dport 80 accept
nft add rule inet allow_port tcp443 ip saddr 192.168.0.0/24 tcp dport 443 accept
nft add rule inet allow_port ssh ip saddr 192.168.0.0/24 tcp dport 22 accept 

3. 最后,将默认的INPUT策略设置为DROP,以阻止所有其他未明确允许的流量通过。可以使用以下命令来完成此操作:
nft add rule inet filter INPUT ct state invalid drop
nft add rule inet filter INPUT ct state { established, related } accept
nft add rule inet filter INPUT iifname lo accept
nft add rule inet filter INPUT ip protocol icmp accept
nft add rule inet filter INPUT tcp flags & (fin | syn | rst | ack) == ack drop
nft add rule inet filter INPUT tcp dport 22 ct state new,untracked jump allow_port ssh
nft add rule inet filter INPUT tcp dport 80 ct state new,untracked jump allow_port tcp80
nft add rule inet filter INPUT tcp dport 443 ct state new,untracked jump allow_port tcp443
nft add rule inet filter INPUT icmp type { echo-request, echo-reply } icmpv6 type { echo-request, echo-reply } drop
nft add rule inet filter INPUT drop 

以上规则将允许来自192.168.0.0/24网络的流量通过80、443和SSH端口,并阻止所有其他流量通过。请注意,这些规则可能需要根据您的具体情况进行调整。

20. 总结关系型数据库相关概念,关系,行,列,主键,惟一键,域。

关系型数据库是由一组表(或称为关系)构成的数据库系统。表由行和列组成,每个表都有一个名称,同时还有一些与之相关联的术语。
1、关系:在关系型数据库中,数据以关系表的形式存储。每个关系表都有一个名称,用于标识该表,并且包含若干条记录。
2、行:也称作元组或记录,表示表中的每一条数据。每一行包含一些列值。行可以被唯一地标示出来,通常使用主键来标识。
3、列:也称作字段或属性,表示表中的一个数据类型。每个列都有一个名称和数据类型。表中每个记录都包含相同的列,但是每个记录中每个列的值可以不同。
4、主键:是表中能够唯一标识每一条记录的一列或一组列。主键必须具有唯一性,且不能为空值。
5、唯一键:也称为惟一索引,是指除了主键以外能够唯一标识每一条记录的一列或一组列。唯一键值可以为空,但这种情况只允许出现一次。
6、域:也称为数据类型,是给定列所能包含的数据值的集合,包括数据类型的范围、约束条件等。每个列都定义了一个域。

21. 总结关联类型,1对1,1对多,多对多关系。可以自行设计表进行解释。
关联类型指的是数据库中不同表之间进行数据关联的方式。常见的关联类型有三种:1对1、1对多和多对多。
1对1(One-to-One)关系:指两个表中的记录之间是一对一的关系,即一个记录只能与另一个记录对应。这种关系通常在单个实体的不同方面拆分为不同表时使用,以便将数据归类并更好地管理。例如,假设我们需要存储人员信息和其日常工作信息,则可以将它们分别存储在两个表中,并使用相同的主键来关联它们。
例如:

    CREATE TABLE person(
        id int PRIMARY KEY,
        name varchar(50) NOT NULL,
        age int NOT NULL
    );
    
    CREATE TABLE work(
        id int PRIMARY KEY,
        job_title varchar(50) NOT NULL,
        salary float NOT NULL,
        person_id int UNIQUE NOT NULL,
        FOREIGN KEY(person_id) REFERENCES person(id)
    );

在上述示例中,person表和work表之间存在1对1关系,每个person记录都只对应一个work记录,每个work记录也只对应一个person记录。person表的id列是其主键,在work表中,person_id列不仅是唯一键,还是外键,用于与person表建立关联关系。
1对多(One-to-Many)关系:指两个表中的记录存在一对多的关系,即一个记录可以对应多个其他表中的记录。例如,用户可以创建多篇文章,这些文章都是由该用户发布的。在这种情况下,用户表和文章表就存在1对多关系。
例如:

    CREATE TABLE user(
        id int PRIMARY KEY,
        username varchar(50) NOT NULL,
        email varchar(50) NOT NULL
    );
    
    CREATE TABLE post(
        id int PRIMARY KEY,
        title varchar(50) NOT NULL,
        content text NOT NULL,
        user_id int NOT NULL,
        FOREIGN KEY(user_id) REFERENCES user(id)
    );

在上述示例中,user表和post表之间存在1对多关系,每个user记录可以对应多个post记录,但每个post记录只能对应一个user记录。user表的id列是其主键,在post表中,user_id列是外键,用于与user表建立关联关系。
多对多(Many-to-Many)关系:指两个表中的记录存在多对多的关系,即一个记录可以对应多个其他表中的记录,反之亦然。例如,学生可以注册多个课程,而每个课程也可以有多个学生。在这种情况下,学生表和课程表之间就存在多对多关系。
例如:

    CREATE TABLE student(
        id int PRIMARY KEY,
        name varchar(50) NOT NULL
    );
    
    CREATE TABLE course(
        id int PRIMARY KEY,
        name varchar(50) NOT NULL
    );
    
    CREATE TABLE student_course(
        student_id int NOT NULL,
        course_id int NOT NULL,
        PRIMARY KEY(student_id, course_id),
        FOREIGN KEY(student_id) REFERENCES student(id),
        FOREIGN KEY(course_id) REFERENCES course(id)
    );

在上述示例中,Student表和Course表之间存在多对多关系,每个Student记录可以对应多个Course记录,同样,每个Course记录也可以对应多个Student记录。为了表示这种多对多关系,我们需要创建一个中间表,称为student_course,该表中包含从student表和course表到学生和课程之间多对多关系的交叉引用。student_course表中的student_id和course_id列是外键,用于与student表和course表建立关联关系。同时,student_id和course_id两列组成了复合主键,在student_course表中必须唯一且不能为NULL。

22. 总结mysql设计范式

MySQL设计范式是指数据库设计中用于减少数据冗余和维护数据一致性的规则。下面是常见的三种MySQL设计范式:
1. 第一范式(1NF):确保每个列都是原子性的,即每个列只包含一个属性值。
2. 第二范式(2NF):要求每个非主键列完全依赖于主键而不是部分依赖于主键。
3. 第三范式(3NF):在满足第二范式的基础上,消除非关键列对其他非关键列的传递依赖关系,即每个非主键列只能依赖于主键列。
遵循这些设计范式可以使数据库设计更加标准化、可扩展和易于维护。

23. 总结Mysql多种安装方式,及安全加固,并总结mysql配置文件。

1. Mysql安装方式
(1) RPM包方式安装:
CentOS官方源提供了MySQL的RPM包,可以通过以下命令进行安装:
yum install mysql
(2) YUM方式安装:
如果官方源没有提供MySQL的RPM包,也可以通过YUM进行安装。首先需要导入MySQL的YUM源:
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum localinstall mysql57-community-release-el7-10.noarch.rpm
然后就可以通过YUM进行安装了:
yum install mysql-server
(3) 源码安装&二进制安装:
下载MySQL的源码包,并解压:
tar -zxvf mysql-xxx.tar.gz
然后进入解压之后的目录,执行以下命令进行安装:
cmake .
make && make install 

2. Mysql安全加固
为了保证MySQL的安全性,需要进行以下操作:
(1) 修改MySQL默认密码:
MySQL的默认密码是空密码,需要修改为复杂密码:
mysqladmin -u root password "new_pwd"
(2) 删除无用用户:
MySQL默认会创建一些无用的用户,需要删除这些用户,例如:
DROP USER ''@'localhost';
DROP USER ''@'host_name';
(3) 修改root用户的权限:
root用户默认是拥有所有权限的,需要修改其权限,例如:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM root@localhost;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW ON *.* TO 'root'@'localhost';
(4) 禁止远程访问:
为了防止黑客攻击,应该禁止MySQL的远程访问:
UPDATE mysql.user SET Host = '127.0.0.1' WHERE User = 'root';
(5) 更改MySQL端口:
默认情况下,MySQL的端口是3306,需要更改为其他端口,例如:
vi /etc/my.cnf
# 在[mysqld]下添加以下内容
port=3307
然后重启MySQL:
systemctl restart mysqld 

3. MySQL配置文件
MySQL的配置文件位于/etc/my.cnf或者/etc/mysql/my.cnf。
配置文件中的一些重要的参数如下:
(1) character_set_server:指定服务器使用的字符集。
(2) max_connections:指定允许同时连接到MySQL服务器的最大连接数。
(3) wait_timeout:指定一个连接在空闲状态下能够保持多久,超时后将被自动断开。
(4) innodb_buffer_pool_size:指定InnoDB存储引擎使用的缓存池大小。
(5) log_bin:指定二进制日志文件的位置及文件名。
(6) expire_logs_days:指定二进制日志文件保留的天数,超过该天数的日志文件将被删除。

posted @ 2023-03-10 09:16  Jack_Cui  阅读(48)  评论(0编辑  收藏  举报