0
点赞
收藏
分享

微信扫一扫

N74第五周作业

金穗_ec4b 2023-05-17 阅读 34

1.总结openssh服务安全加固

要将OpenSSH服务加固,可以考虑以下几个步骤:

  1. 修改默认端口:默认情况下,OpenSSH服务监听在22端口上。黑客可以扫描这个端口,并尝试使用常见的用户名和密码来进行暴力crack。因此,将SSH服务迁移到一个非标准端口(比如2200)是一种简单且有效的保护方法。
  2. 禁用root用户登录:禁用root用户直接登录SSH是一种良好的安全实践。因为黑客可以使用该帐户作为目标,并尝试使用暴力crack来获取访问权限。同时也可以创建一个具有sudo权限的非root用户。
  3. 使用双因素身份验证:双因素身份验证(2FA)能够提高SSH服务的安全性。这种技术需要用户提供两个或多个因素,如密码和令牌、指纹等。 通过使用2FA,黑客需要获得更多的信息才能突破身份验证。
  4. 配置限制登录尝试次数:SSH服务可以设置以限制登录尝试次数并防止暴力crack。 可以通过修改/et/ssh/sshd_config文件中的MaxAuthTries字段来控制允许的最大尝试次数。
  5. 禁用密码身份验证:使用SSH密钥对进行身份验证比使用密码更加安全。因此,可以通过修改sshd_config中的PasswordAuthentication字段来禁用密码登录。
  6. 更新SSH客户端和服务端软件:保持SSH软件最新是非常重要的,因为这将确保其具有最新的安全修补程序和最佳实践。
  7. 禁止使用SSHv1。
  8. 设定空闲会话超时时长。
  9. 仅监听特定的IP地址。

综上所述,通过以上几个步骤,可以帮助加固OpenSSH服务,提高SSH服务的安全性。

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

sudo是一个允许系统管理员授权普通用户执行特定命令的工具,其配置文件为/etc/sudoers。

sudoers文件由多行规则组成,每行规则指定了哪个用户可以以哪个身份(即以哪个用户、组、主机等身份)执行哪些命令。以下是sudoers文件中常用的语法:

user host=(runas) command						#允许user在host机器上以runas用户的身份执行command命令

%group host=(runas) command					#允许group组的所有成员在host机器上以runas用户的身份执行command命令

user ALL=(ALL) NOPASSWD:ALL					#允许user在所有机器上以所有身份执行任何命令而无需输入密码

下面是一些sudoers文件的示例:

  • 允许用户jason在本机以root用户的身份执行/sbin/reboot命令:

jason localhost=(root) /sbin/reboot

  • 允许用户bob在10.0.0.1机器上以apache用户的身份执行/usr/sbin/apachectl命令:

bob 10.0.0.1=(apache) /usr/sbin/apachectl

  • 允许组developers在所有机器上以jenkins用户的身份执行/usr/bin/java和/usr/bin/mvn命令,而无需输入密码:

%developers ALL=(jenkins) NOPASSWD:/usr/bin/java,/usr/bin/mvn

在sudoers文件中,可以使用alias定义一些常用的名字、主机、用户或者命令等对象。这样可以使sudoers文件更加简洁和易于维护,同时也方便对同一组对象进行统一管理。

在sudoers文件中定义alias的语法如下:

User_Alias     ALIAS_NAME = user_list
Host_Alias     ALIAS_NAME = host_list
Cmnd_Alias     ALIAS_NAME = command_list
Runas_Alias    ALIAS_NAME = runas_list

其中,ALIAS_NAME为自己指定的名称,user_list、host_list、command_list和runas_list分别为包括用户、主机、命令和身份的列表,在列表中使用逗号分隔。

使用alias的示例:

User_Alias     ADMIN = alice, bob, charlie
Host_Alias     SERVERS = server1, server2, server3
Cmnd_Alias     PROJECT_CMDS = /usr/bin/make, /usr/bin/gcc, /usr/bin/g++, /usr/bin/gdb
Runas_Alias    WEBUSER = www-data

ADMIN ALL=(ALL) ALL
ADMIN SERVERS=(ALL) PROJECT_CMDS
%developers SERVERS=(WEBUSER) PROJECT_CMDS

上述规则中,定义了一个名为ADMIN的用户别名,包括了alice、bob和charlie三个用户;定义了一个名为SERVERS的主机别名,包括了server1、server2和server3三台主机;定义了一个名为PROJECT_CMDS的命令别名,包括了make、gcc、g++和gdb四个命令;定义了一个名为WEBUSER的身份别名,代表www-data用户。

最后三行规则分别允许ADMIN用户在所有主机和身份下执行任意命令,允许SERVERS主机上的ADMIN用户组以任何身份执行PROJECT_CMDS所包含的四个命令,允许developers组的用户以WEBUSER身份在SERVERS主机上执行PROJECT_CMDS所包含的四个命令。

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

N74第五周作业_防火墙

PAM(Pluggable Authentication Modules)是一种面向认证的模块化框架,以插件形式提供灵活的身份认证机制,并且可以轻松地添加、更新和管理认证模块。PAM架构常用于Linux/Unix系统中,它的主要工作原理如下:

  1. 当用户尝试通过某种方式(例如:登录终端,SFTP连接等)访问系统时,系统会请求PAM库进行身份验证。
  2. PAM库会根据指定的配置文件确定需要使用哪些认证模块,并按照指定的顺序依次调用这些认证模块。
  3. 每个认证模块对用户提供的身份信息进行验证。如果验证成功,则PAM库会将用户标记为已认证;否则,PAM库会拒绝用户的访问请求。
  4. 当所有认证模块都完成验证后,PAM库会根据最终的认证结果决定是否授权用户访问系统。

总之,PAM架构提供了一种可扩展、可定制的身份认证框架,能够在不修改系统核心代码的情况下,灵活地定制系统的身份认证流程。

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

PAM(Pluggable Authentication Modules)的配置文件位于/etc/pam.d目录下,用于描述各应用程序的身份认证流程。其主要格式如下:

工作类别  控制模式  模块路径  模块参数

# 控制认证过程的控制标记,通常是required, requisite, sufficient或者optional
auth  required  <module_name>  <module_arguments>

# 控制帐户管理行为
account  required  <module_name>  <module_arguments>

# 控制会话管理行为
session  required  <module_name>  <module_arguments>

# 控制密码管理行为
password  required  <module_name>  <module_arguments>

其中,<module_name>指定了要加载的认证模块的名称,<module_arguments>指定了传递给该模块的参数。

每个控制标记描述了在进行身份验证时如何处理相关模块的返回值。如果使用了"required"标记,则必须成功通过该模块才能进行后续操作;"requisite"标记与"required"类似,但如果模块返回失败则会立即结束认证过程;"sufficient"标记表示如果模块返回成功则将继续执行下一个模块,否则不作任何处理;"optional"标记表示即使模块返回失败也将继续执行下一个模块。

PAM配置文件采用了一种简单的格式,通过控制标记对认证流程进行灵活的控制。它提供了一种可扩展、可定制的身份认证框架,能够在不修改系统核心代码的情况下,灵活地定制系统的身份认证流程。

/etc/pam.d/login 的内容如下:

#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so

例子的最后一行开头有一个短横线 -,意思是如果找不到这个模块,导致无法被加载时,这一事件不会被记录在日志中。这个功能适用于那些认证时非必需的、安装时可能没被安装进系统的模块。

nologin.so是一个PAM模块,用于控制哪些用户可以登录系统。它通常在PAM配置文件的account部分中使用。当一个用户尝试登录到系统,且该用户在/etc/nologin文件中被列入黑名单时,nologin.so模块会阻止该用户登录,并向用户显示一个自定义的错误信息。

具体来说,如果nologin.so模块被配置为requiredrequisite,当用户尝试登录时,如果该用户被列入/etc/nologin文件中,则系统会拒绝该用户的登录请求,并提示一个自定义的错误信息;如果该用户不在/etc/nologin文件中,则其他的PAM模块将会继续进行身份验证过程。

通常情况下,nologin.so模块被用于禁止一些特定用户登录系统,例如管理员正在对系统进行更新或维护,需要暂停所有普通用户的登录权限。在这种情况下,在/etc/nologin文件中添加一个包含自定义消息的文本文件即可。

pam_limits.so是一个PAM模块,用于限制系统中进程的资源使用。它可以被用于限制用户或组的进程能够使用的资源数量和大小,例如 CPU 时间、内存、打开文件数、虚拟内存等等。这些限制可以防止用户运行恶意进程或意外地耗尽系统资源。

该模块通常在PAM配置文件中的session部分中使用,以为登录会话设置系统资源限制。该模块处理 /etc/security/limits.conf 文件中包含的限制规则,并将这些限制应用到用户或进程。

/etc/security/limits.conf 文件是一个文本文件,其中列出了每个用户或组的资源限制规则。其中,支持设置的资源类型包括以下几种:

  • core:设置进程可以生成的核心转储文件的最大大小;
  • data:设置进程数据段的最大大小;
  • fsize:设置进程创建的文件大小的最大值;
  • memlock:设置进程使用锁定内存的最大值;
  • nofile:设置进程可以同时打开的文件描述符的最大数量;
  • rss:设置进程可以使用的最大驻留集大小;
  • nproc:设置用户或进程可以拥有的最大进程数量;
  • as:设置进程可以使用的最大地址空间大小;
  • stack:设置进程的栈空间大小;
  • cpu:设置进程可以使用的每个 CPU 时间的最大秒数;
  • nice:设置进程可以使用的最大"优先级增量"值;
  • rtprio:设置实时进程的最大实时优先级值。

pam_limits.so 模块可以帮助管理员更好地管理系统资源的使用,从而提高系统的可靠性和安全性。

下面是一个/etc/security/limits.conf 文件的示例:

#<domain>  		<type>  	<item>     <value>
#进程所有者    限制类型  资源类型    限制值
#
# '*'代表所有用户或组

# Example:
#*               soft    core            0
#root            hard    core            100000

# 设置所有用户的文件描述符限制:
*               soft    nofile          8192
*               hard    nofile          16384

# 设置特定用户的软、硬限制:
alice           soft    nproc           200
alice           hard    nproc           500
bob             soft    memlock         100000
bob             hard    memlock         200000

# 容器类应用的基本限制
#*              hard    rss             unlimited
#*              hard    memlock         unlimited

# 允许nobody用户使用10分钟的CPU时间
nobody          soft    cpu             600

# 给予realtime用户组所有用户更高的优先级
@realtime       soft    rtprio          90
@realtime       hard    rtprio          99

这个文件中的每一行都由4个字段组成,分别是进程所有者(可以是用户名、用户组名或*表示所有用户)、软限制、资源类型和限制值。其中,软限制和硬限制分别设置限制值的软和硬限制。软限制是指进程可以使用的最大资源量,超过此限制时进程可能会受到警告或被杀死;硬限制是指进程可以使用的最大资源量,超过此限制时进程将被强制终止。

在示例中,* soft nofile 8192设置了所有用户的软文件描述符限制为8192个,alice soft nproc 200设置了用户名为alice的用户的软进程数量限制为200个。另外,nobody soft cpu 600指定了用户nobody可以使用10分钟的CPU时间,@realtime soft rtprio 90@realtime hard rtprio 99分别为用户组realtime设置了实时进程的软/硬优先级。

5.实现私有时间服务器

要利用chrony实现私有时间服务器,您需要完成以下步骤:

  1. 安装chrony

首先,您需要在您的服务器上安装chrony。具体命令如下:

sudo apt install chrony

  1. 配置chrony

接下来,您需要编辑chrony的配置文件。您可以执行以下命令打开默认配置文件:

sudo vim /etc/chrony/chrony.conf

在配置文件中,您需要设定一些时间服务器的IP地址,那么您需要添加以下内容:

server ntp.aliyun.com iburst
server ntp.tencent.com iburst
server ntp.ntsc.ac.cn
server pool.ntp.org iburst

另外,您需要允许其他主机访问您的时间服务器,修改allow选项,将其设置为全局:

allow all

最后,保存并退出文件。

  1. 启动chrony

完成配置后,您需要启动chrony来应用所做的更改。执行以下命令来启动chrony:

sudo systemctl start chrony

  1. 检查chrony状态

您可以使用以下命令检查chrony是否正在运行:

sudo systemctl status chrony

如果输出显示"Active: active (running)",那么chrony正在运行。

  1. 配置客户端

现在您已经有了一个私有时间服务器,您需要在需要同步时间的客户端机器上配置chrony。

在客户端上,您需要编辑新的chrony配置文件 /etc/chrony/chrony.conf,将其中的server选项修改为您的私有时间服务器的IP地址,假设私有时间服务器IP地址为192.168.1.100:

server 192.168.1.100 iburst

另外,您可以使用以下命令来立即启动chrony并使其立即同步时间:

sudo systemctl restart chrony

现在您已经完成了所有配置,您的客户端机器应该可以成功连接到您的私有时间服务器以获取正确的时间。

6.总结DNS域名三级结构

DNS域名结构分为三级:主机名、二级域名和顶级域名。其中,主机名指的是主机设备的名称,比如“www”、“mail”等;

二级域名指的是主机所在的域名,比如“google.com”中的“google”就是一个二级域名;

而顶级域名则是在二级域名后面的最后部分,比如“.com”、“.net”、“.edu”等。

以“www.google.com”为例,其中“www”是主机名,“google”是二级域名,“.com”则是顶级域名。这种三级结构的域名系统使得互联网上的每个设备都能够用一个唯一的域名进行标识,从而方便用户进行访问和交流。

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

DNS(Domain Name System)服务是一种将域名与IP地址相互映射的系统,它可以将人类可读的域名转化成计算机可读的IP地址,使得用户可以通过域名来访问Internet上的各种服务。DNS服务通常包括两个步骤:递归查询和迭代查询。

递归查询是一种DNS服务器的查询模式,在该模式下DNS服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。

DNS服务器另外一种查询方式为迭代查询,DNS服务器会向客户机提供其他能够解析查询请求的DNS服务器地址,当客户机发送查询请求时,DNS服务器并不直接回复查询结果,而是告诉客户机另一台DNS服务器地址,客户机再向这台DNS服务器提交请求,依次循环直到返回查询的结果。

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

要实现私有DNS,你需要按照以下步骤操作:

  1. 安装 DNS 服务器软件,常见的有 BIND、dnsmasq 等多种选择;
  2. 配置 DNS 服务器软件,设置本地网络主机可以访问的 DNS 域名解析区域;
  3. 在 DNS 服务器上添加需要解析的域名记录,例如本地局域网内的计算机名和 IP 地址对应关系。

在完成这些配置后,你就可以将 DNS 服务器的地址设置为本地网络主机的 DNS 服务器,并进行递归查询。如果一切配置正确,DNS 服务器应该能够返回正确的结果。

#假设在magedu.org域的主DNS服务器上实现,10.0.0.48/24
dnf install bind -y

vim /etc/named.conf
#注释掉下面两行
//	listen-on port 53 {127.0.0.1;};
//	allow-query				{localhost;};

#只允许 从服务器 进行区域传输
allow-transfer {从服务器IP;};

vim /etc/named.rfc1912.zones
#加上这段
zone "magedu.org"{
	type master;
  file "magedu.org.zone";
};

vim /var/named/magedu.org.zone
$TTL 1D
@			IN	SOA	master admin.magedu.org.	(
											1	;	serial
                      1D	;	refresh
                      1H	;	retry
                      1W	;	expire
                      3H	;	minimum
											)
         	NS	master
          NS	slave
master		A		10.0.0.48
slave			A		10.0.0.58
www				A		10.0.0.68

chgrp named /var/named/magedu.org.zone

systemctl start named				#第一次启动服务
rndc reload									#不是第一次启动服务,重新加载配置文件

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

DNS服务器类型可以分为以下几种:

  1. 递归型DNS服务器:当客户端请求访问某个域名时,递归型DNS服务器会直接向根域名服务器发起查询,并从上到下依次向下级服务器查询,直到获取该域名的IP地址并返回给客户端。
  2. 权威型DNS服务器:权威型DNS服务器记录着某个特定区域内所有主机的IP地址,当其他DNS服务器需要解析本区域内的域名时,就会向该权威型DNS服务器发起查询请求。
  3. 缓存型DNS服务器:缓存型DNS服务器会将最近查询过的域名解析结果保存在本地,下次有相同域名查询请求时直接返回已经保存的结果,加快查询速度。
  4. 前置型DNS服务器:前置型DNS服务器是指在客户端与递归型DNS服务器之间设置的一台DNS服务器,对于一些常用的域名,可以提前进行查询,并将结果保存在本地,避免多次发送查询请求。

DNS解析答案是指通过DNS服务器查询出来的IP地址信息。当客户端发起访问某个域名的请求时,DNS服务器会进行一系列的查询操作,最终返回一个IP地址给客户端,客户端便可以通过该IP地址访问目标网站或服务器。

正反解析域是指DNS服务器解析域名时所支持的两种不同查询方式。正向解析是指通过域名查找对应IP地址的过程,而反向解析则是指通过IP地址查找对应域名的过程。

资源记录定义是指DNS服务器在进行域名解析时所需要查询的不同种类的信息。常见的资源记录类型包括A记录、MX记录、CNAME记录、PTR记录、NS记录等。其中,A记录用于指定主机名和IP地址之间的对应关系,MX记录用于指定邮件服务器的域名地址,CNAME记录用于指定别名,PTR记录用于反向域名解析,NS记录则用于指定一个区的DNS服务器名称。

10.实现DNS主从同步

DNS主从同步,也称为DNS区域传输(AXFR),是一种将DNS数据从主服务器复制到从服务器的方法。可以通过以下步骤来实现DNS主从同步:

  1. 在主DNS服务器上配置一个或多个区域,并设定允许从服务器查询该区域。
  2. 在从DNS服务器上配置一个或多个区域,并设定主DNS服务器作为该区域的数据来源。
  3. 在主DNS服务器上,将允许从服务器进行区域传输的设置,通常是指定从服务器的IP地址。
  4. 在从DNS服务器上,设置定时器以执行区域传输,以便在检测到主DNS服务器已更改区域信息时自动更新数据。

需要注意的是,在配置DNS主从同步时,应确保网络中主DNS服务器的防火墙和路由器不会阻止从DNS服务器对其进行查询。此外,建议使用TCP协议而非UDP协议,因为TCP协议更可靠。

#在magedu.org域从DNS服务器10.0.0.58/24上实现
dnf install bind -y

vim /etc/named.conf
//	listen-on port 53 {127.0.0.1;};
//	allow-query				{localhost;};

#不允许其他主机进行区域传输
allow-transfer	{none;};

vim /etc/named.rfc1912.zones
zone	"magedu.org"	{
	type slave;
  masters	{主服务器IP;};]
  
  file "slaves/magedu.org.slave";
};

systemctl start named				#第一次启动服务
rndc reload									#不是第一次启动服务,重新加载配置文件

ls /var/named/slaves/magedu.org.slave  #查看区域数据库文件是否生成

11.实现DNS子域授权

DNS子域授权是将特定的子域名授权给其他DNS服务器进行管理的过程。实现DNS子域授权需要以下步骤:

  1. 在父域名下创建一个新的DNS区域,用于存储要授权的子域名的DNS记录。
  2. 在该新的DNS区域中添加NS记录,指向负责管理子域名的DNS服务器。
  3. 在负责管理子域名的DNS服务器上创建相应的子域名记录,并确保它们与父域名的DNS记录一致。
  4. 在父域名的主DNS服务器上添加一条NS记录,指向负责管理子域名的DNS服务器。

这样做可以确保子域名的DNS查询被正确地路由到负责管理该子域名的DNS服务器上,并且能够保证DNS解析的可靠性和稳定性。

父域DNS设置

dnf install bind
vim /etc/named.conf
#注释掉下面两行
//	listen-on port 53 {127.0.0.1;};
//	allow-query				{localhost;};

#只允许从服务器进行区域传输
allow-transfer {从服务器IP;};

#建议关闭加密验证
dnssec-enable no;
dnssec-validation no;

vim /etc/named.rfc1912.zones
#加上这段
zone "magedu.org" {
	type master;
  file "magedu.org.zone";
};

cp -p /var/named/named.localhost  /var/named/magedu.org.zone
#借鉴范本,同时注意-p保留权限

vim /var/named/magedu.org.zone
$TTL 1D
@			IN	SOA	master admin.magedu.org.	(
											1	;	serial
                      1D	;	refresh
                      1H	;	retry
                      1W	;	expire
                      3H	;	minimum
											)
         			NS	master
shanghai  		NS	shanghains
master				A		10.0.0.8
shanghains		A		10.0.0.18
www						A		10.0.0.7

systemctl start named						#第一次启动服务
rndc reload											#不是第一次启动服务

子域DNS服务器设置

dnf install bind

vim /etc/named.conf
#注释掉下面两行
//	listen-on port 53 {127.0.0.1;};
//	allow-query				{localhost;};
allow-transfer	{none;};

vim /etc/named.rfc1912.zones
zone "shanghai.magedu.org"	{
	type master;
  
  file "shanghai.magedu.org.zone";
};

cp -p /var/named/named.localhost  /var/named/shanghai.magedu.org.zone
#借鉴范本,同时注意-p保留权限


vim /var/named/shanghai.magedu.org.zone


$TTL 1D
@			IN	SOA	master admin.magedu.org.	(
											1	;	serial
                      1D	;	refresh
                      1H	;	retry
                      1W	;	expire
                      3H	;	minimum
											)
         			NS	master

master				A		10.0.0.18
www						A		10.0.0.17

systemctl start named					#第一次启动服务
rndc reload										#不是第一次启动服务

12.基于acl实现智能DNS

ACL是Access Control List的缩写,它是一种用于限制网络访问的策略。在实现智能DNS中,我们可以使用ACL来控制哪些IP地址可以访问特定的DNS记录。

具体实现步骤如下:

  1. 在DNS服务器上创建ACL列表,例如允许内部网络192.168.0.0/16访问特定的DNS记录。
  2. 根据需要,在DNS服务器上设置相应的DNS记录,并将ACL规则添加到这些记录上。
  3. 当客户端请求DNS记录时,DNS服务器将检查ACL规则,如果客户端的IP地址在ACL规则中,则将返回相应的DNS记录;否则,DNS服务器将返回无效的DNS记录或错误信息。
在bind中利用view实现智能DNS

dnf install bind

vim /etc/named.conf
#在文件最前面加入以下行
acl beijingnet	{
	10.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 beijingview {
	match-clients		{beijingnet;};
  include	"/etc/named.rfc1912.zones.bj";
};

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.bj

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

zone "magedu.org" {
	type master;
  file "magedu.org.zone.bj";
};

vim /etc/named.rfc1912.zones.sh

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

zone "magedu.org" {
	type master;
  file "magedu.org.zone.sh";
};

vim /etc/named.rfc1912.zones.other

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

zone "magedu.org" {
	type master;
  file "magedu.org.zone.other";
};

chgrp named /etc/named.rfc1912.zones.bj
chgrp named /etc/named.rfc1912.zones.sh
chgrp named /etc/named.rfc1912.zones.other

创建区域数据库文件

vim /var/named/magedu.org.zone.bj

$TTL 1D
@			IN	SOA	master admin.magedu.org.	(
											1	;	serial
                      1D	;	refresh
                      1H	;	retry
                      1W	;	expire
                      3H	;	minimum
											)
         			NS	master

master				A		10.0.0.8
websrv				A		10.0.0.7
www						CNAME	websrv

vim /var/named/magedu.org.zone.sh

$TTL 1D
@			IN	SOA	master admin.magedu.org.	(
											1	;	serial
                      1D	;	refresh
                      1H	;	retry
                      1W	;	expire
                      3H	;	minimum
											)
         			NS	master

master				A		10.0.0.8
websrv				A		172.16.0.7
www						CNAME	websrv

vim /var/named/magedu.org.zone.other

$TTL 1D
@			IN	SOA	master admin.magedu.org.	(
											1	;	serial
                      1D	;	refresh
                      1H	;	retry
                      1W	;	expire
                      3H	;	minimum
											)
         			NS	master

master				A		10.0.0.8
websrv				A		127.0.0.7
www						CNAME	websrv

chgrp named /var/named/magedu.org.zone.bj
chgrp named /var/named/magedu.org.zone.sh
chgrp named /var/named/magedu.org.zone.other

systemctl start named					#第一次启动服务
rndc reload										#不是第一次启动服务

13.总结防火墙分类

按保护范围划分:
  • 主机防火墙:服务范围为当前一台主机
  • 网络防火墙:服务范围为防火墙一侧的局域网
按实现方式划分:
  • 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一部分功能基于软件实现。如:华为,hillstone,天融信,Cisco
  • 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,Windows防火墙ISA --> Forefront TMG
按网络协议划分
  • 网络层防火墙:OSI模型下四层,又称为包过滤防火墙
  • 应用层防火墙/代理服务器:proxy代理网关,OSI模型七层

包过滤防火墙(Packet Filtering Firewall)是一种基于网络层(第三层)和传输层(第四层)的防火墙技术,它通过过滤网络数据包的源地址、目的地址、协议类型、端口号等信息,来控制网络流量的进出。在数据包转发时,包过滤防火墙会根据预设的规则对数据包进行过滤,只允许符合规则的数据包通过,从而实现对网络安全的保护。

具体来说,包过滤防火墙可以根据源地址和目标地址的IP地址、MAC地址、域名等信息,以及传输协议(如TCP、UDP、ICMP等)和端口号来确定是否允许数据包通过。例如,可以设定规则,只允许来自已知网络的数据包进入,或者只允许指定端口上的数据流量通过。

相比于其他类型的防火墙,包过滤防火墙具有以下优点:

  1. 轻量级:包过滤防火墙的算法简单,能够在更小的硬件平台上运行,不需要大量的资源开销。
  2. 高效性:数据包被过滤前,不需要对数据进行深度扫描或解码,由此可以保持良好的网络性能。
  3. 灵活性:可根据需求调整规则,以实现对多种不同类型的恶意attack进行防范。
  4. 低成本:由于硬件配置需求较低,使得包过滤防火墙比其他类型的防火墙成本更低。

总结来说,包过滤防火墙是一种较为简单、经济、高效的防火墙技术。虽然它的功能相对有限,但在许多网络环境中都可以提供基本的网络安全保护。

应用层防火墙(Application Layer Firewall)是一种基于应用层(第七层)的防火墙技术。它通过检查网络数据包中的应用层协议(如HTTP、FTP、SMTP等)和通信内容,来确定是否允许数据包通过。与其他类型的防火墙相比,应用层防火墙能够提供更高级别的防护,可以检测和阻止一些更复杂的attack,如应用程序级别的漏洞利用和Web应用程序attack等。

应用层防火墙工作在传输层(第四层)和应用层(第七层)之间,具有以下特点:

  1. 支持特定应用协议:应用层防火墙可以检测和允许特定的应用协议通过,例如HTTP、FTP、SMTP等,从而确保这些协议的安全性。
  2. 网络流量精细控制:应用层防火墙可以对网络数据流量进行更细粒度的控制,例如可以根据URL、cookie、用户名和密码等信息,来过滤或阻断恶意数据包的传输。
  3. 检测和防御应用层attack:应用层防火墙可以对常见的应用层attack,如SQL注入、跨站点脚本attack等,进行检测和防御。
  4. 提高网络安全性:应用层防火墙可以保护Web应用程序、邮件系统、数据库和其他服务器上的重要信息和数据,提高网络安全性。

总之,应用层防火墙是一种能够提供高级别的防护和更细粒度控制的防火墙技术。它非常适合需要保护各类应用程序和Web应用的网络环境中使用,同时它也可以与其他类型的防火墙结合使用来提高网络安全防护水平。

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

iptables 是一种基于 Linux 的防火墙解决方案,它可以用来管理网络数据包的流向,实现网络安全和访问控制等功能。iptables 由五个表(Table)和五个链(Chain)组成。

五个表如下:

  1. raw 表:用于对数据包进行原始处理,这个表通常不需要使用。
  2. filter 表:用于过滤和放行数据包,是 iptables 中最常用的表之一。
  3. nat 表:主要用于 NAT (网络地址转换) 操作,例如将内网的 IP 地址转换为公网的 IP 地址等。
  4. mangle 表:主要用于在数据包通过时修改数据包头的某些字段,例如修改 TTL 值等。
  5. security 表:该表在最新版本的 iptables 中添加了,用于实现 SELinux 和其他安全模块和框架的集成。

五个链如下:

  1. INPUT 链:用于处理进入本地系统的数据包,例如 SSH、HTTP、DNS 等。
  2. OUTPUT 链:用于处理从本地系统发出的数据包,例如发送邮件、请求 Web 页面等。
  3. FORWARD 链:用于处理转发(路由)的数据包,在多个网络之间转发数据包时需要使用此链。
  4. PREROUTING 链:用于处理数据包在路由之前的操作,例如 DNAT (目标地址转换) 等。
  5. POSTROUTING 链:用于处理数据包在路由之后的操作,例如 SNAT (源地址转换) 等。
语法

iptables(选项)(参数)

选项

-t, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。

# 通用匹配:源地址目标地址的匹配
-p:指定要匹配的数据包协议类型;
-s, --source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-i, --in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
-o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。

# 查看管理命令
-L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。

# 规则管理命令
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
-R num:Replays替换/修改第几条规则

# 链管理命令(这都是立即生效的)
-P, --policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的。
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-N, --new-chain chain 用指定的名字创建一个新的链。
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响。
-Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。

-j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
-h:显示帮助信息;

命令选项输入顺序

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

实例

清空当前的所有规则和计数

iptables -F  # 清空所有的防火墙规则
iptables -X  # 删除用户自定义的空链
iptables -Z  # 清空计数

配置允许ssh端口连接

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接。 -j ACCEPT表示接受这样的请求

允许本地回环地址可以正常使用

iptables -A INPUT -i lo -j ACCEPT
#本地环回地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许
iptables -A OUTPUT -o lo -j ACCEPT

设置默认的规则

iptables -P INPUT DROP # 配置默认的不让进
iptables -P FORWARD DROP # 默认的不允许转发
iptables -P OUTPUT ACCEPT # 默认的可以出去

配置白名单

iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT  # 允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT  # 允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口

开启相应的服务端口

iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口,因为web对外都是这个端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来

以下是一些iptables扩展模块的使用示例:

  1. conntrack 模块

该模块可以跟踪连接状态,实现连接匹配和状态匹配。例如,下面的命令可以筛选出来源地址为 192.168.1.0/24 的 SSH 连接:

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m conntrack --ctorigsrc 192.168.1.0/24 -j ACCEPT

  1. limit 模块

该模块可以限制数据包数量和频率,防止 DoS 等。例如,下面的命令可以限制来源地址为 192.168.1.1 的主机在 10 秒钟内只能发送 3 个 ICMP 报文:

iptables -A INPUT -s 192.168.1.1 -p icmp --icmp-type echo-request -m limit --limit 3/10s -j ACCEPT

  1. tcpudp 模块

该模块可以让用户根据传输层协议 (TCP 或 UDP) 进行过滤。例如,下面的命令可以筛选出目标端口为 80 的 HTTP 流量:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

  1. addrtype 模块

该模块可以根据来源地址类型 (unicast、broadcast、multicast 等) 进行过滤。例如,下面的命令可以筛选出来源地址为组播地址的数据包:

iptables -A INPUT -m addrtype --src-type MULTICAST -j ACCEPT

  1. recent 模块

该模块可以根据某个 IP 的出现次数和时间进行过滤,实现流量控制等功能。例如,下面的命令可以限制来源地址为 192.168.1.1 的主机在 10 分钟内只能连接 3 次 SSH 服务器:

iptables -A INPUT -s 192.168.1.1 -p tcp --dport 22 -m recent --set --name SSH --rsource
iptables -A INPUT -s 192.168.1.1 -p tcp --dport 22 -m recent --rcheck --seconds 600 --hitcount 3 --name SSH --rsource -j DROP

  1. geoip 模块

该模块可以通过 IP 地址的地理位置信息进行过滤,实现基于地理位置的访问控制。例如,下面的命令可以禁止来源国家为日本的访问:

iptables -A INPUT -m geoip --src-cc JP -j DROP

  1. string 模块

该模块可以对数据包的负载进行字符串匹配,实现应用层协议的精确过滤。例如,下面的命令可以拦截 FTP 命令 PORT 和 PASV:

iptables -A OUTPUT -p tcp --dport 21 -m string --string "PORT" --algo bm -j DROP
iptables -A OUTPUT -p tcp --dport 21 -m string --string "PASV" --algo bm -j DROP

以上是一些 iptables 扩展模块的使用示例,但是具体的使用方式需要根据实际情况来进行选择和配置。

iptables 的 state 扩展模块可以根据数据包的连接状态进行过滤。该模块可以判断数据包是否是建立连接、已建立连接、相关连接、无法识别连接等状态,并对不同状态的数据包进行不同的处理。

state 模块在 iptables 中常用于防火墙规则配置,可以用于限制非授权访问,有效防止一些常见的attack技术,如 SYN Flood,循环重定向等等。

下面是一些常见的使用示例:

  1. 接受来自已建立连接的数据包

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

  1. 拒绝来自未建立连接或已结束连接的数据包

iptables -A INPUT -m state --state NEW,INVALID -j DROP

  1. 拒绝所有来自外网 (eth0) 的 SYN 数据包

iptables -A INPUT -i eth0 -p tcp --syn -m state --state NEW -j DROP

  1. 拒绝所有来自内网 (eth1) 的 TCP 响应数据包

iptables -A INPUT -i eth1 -p tcp ! --syn -m state --state NEW -j DROP

需要注意的是,在使用 state 模块的时候,往往需要结合其他模块进行更加精细的过滤。例如,可以结合 limit 模块对服务端口的连接数进行限制,防止被 SYN Flood 等技术attack:

iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j DROP

以上是一些常见的 iptables state 模块的使用示例,但对于每个具体的场景下,需要根据实际需求进行选择和配置。

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

  1. 安全放行所有入站和出站的状态为ESTABLISHED状态链接,建议放在第一条,效率更高
  2. 谨慎放行入站的新请求
  3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
  4. 同类规则(访问同一应用,比如:http),匹配范围小的放在前面,用于特殊处理
  5. 不同类的规则(访问不同应用,一个是http,另一个是mysql),匹配范围大的放在前面,效率更高

应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率

  1. 合并规则

合并多个规则可以有效减少防火墙规则数量,简化防火墙过滤流程,提高过滤效率。例如:

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.2.0/24 -p tcp --dport 22 -j ACCEPT

可以合并成:

iptables -A INPUT -s 192.168.0.0/16 -p tcp --dport 22 -j ACCEPT

  1. 使用集合

使用集合可以把多个规则归纳到一个集合中,以提高规则的优化程度。例如:

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT

可以使用集合来代替:

iptables -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --dports 22,80 -j ACCEPT

  1. 快速匹配

在规则列表中,快速匹配规则可以提高过滤速度。需要将最经常使用的规则放在前面,进行优先匹配。例如:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

应该调整成:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

  1. 使用链

对某个目标进行多次操作时,可以使用链,将同类规则集中起来分别处理,可以管控更加准确。例如:

iptables -A FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p tcp --dport 9000 -j ACCEPT

可以改为:

iptables -N MYCHAIN
iptables -A MYCHAIN -p tcp --dport 80 -j ACCEPT
iptables -A MYCHAIN -p tcp --dport 443 -j ACCEPT
iptables -A MYCHAIN -p tcp --dport 9000 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -j MYCHAIN

  1. 使用 ipset

ipset 是 Linux 内核提供的一个框架,可以高效地管理大型 IP 地址集合,适用于过滤判断频繁且数据量大的场合。将类似 IP 地址的相关规则放到一个集合中,可以提高匹配效率,避免重复过滤。例如:

#创建 ipset 集合
ipset create blacklist hash:net
#添加规则
ipset add blacklist 192.168.1.0/24
iptables -I INPUT -m set --match-set blacklist src -j DROP

以上是一些针对 iptables 规则的优化实践,但具体实施需要根据系统架构和应用需求进行规划和设定。

对于 iptables 规则的保存和恢复,可以使用 iptables-saveiptables-restore 命令进行操作。

  1. 保存规则

使用 iptables-save 命令可以将当前 iptables 规则保存到文件中:

iptables-save > /etc/iptables/rules.v4

该命令会将 IPv4 的规则保存到 /etc/iptables/rules.v4 文件中。

  1. 恢复规则

使用 iptables-restore 命令可以从之前保存的规则文件中恢复规则:

iptables-restore < /etc/iptables/rules.v4

该命令会将 /etc/iptables/rules.v4 文件中的 IPv4 规则载入到 iptables 中。

需要注意的是,为了防止恢复新规则时丢失先前的规则,应该将保存好的规则文件放在系统启动时自动载入,这样可以确保 iptables 规则的持久化保存,避免服务器重启后规则被清空。

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

NAT(Network Address Translation,网络地址转换)是一种将私有网络地址转换为公网地址的技术,常用于解决IPv4地址不足的问题。其原理如下:

在一个企业内部局域网中,所有主机都被分配了私有IP地址,而这些地址不能直接被Internet上的主机访问。当内部主机需要访问Internet上的主机时,它们向企业网关发送数据请求,企业网关收到请求后会先将内部主机的源IP地址和端口号转换为一个公网IP地址和端口号,然后将这个公网地址和端口号与目标主机的地址和端口号一起打包成一个新的数据包,并将其发送给Internet上的主机。这样,当Internet上的主机收到数据包时,就会认为这个数据包是来自企业网关的,而不是来自内部主机的。当Internet上的主机回复数据包时,数据包会先发给企业网关,然后再由企业网关将目标地址和端口号转换为内部主机的地址和端口号,最后将数据包转发给内部主机。

总之,NAT技术通过改变IP地址和端口号,将私有地址转换为公网地址,从而实现内部主机访问Internet的功能。

DNAT(Destination Network Address Translation,目的地址转换)是一种在网络层进行的地址转换技术,它是NAT(Network Address Translation,网络地址转换)的一种变形。DNAT技术将一个公网IP地址和端口号映射到内部私有网络中的主机地址和端口号。

具体来说,DNAT技术可以将Internet上访问一个特定公网IP地址和端口号的数据包,转换为目标为内部私有网络中的某个主机的数据包,并将其发送到该主机上。这样,在Internet上,用户可以通过访问公网IP地址和端口号来访问内部主机,而不需要知道内部主机的实际IP地址和端口号。

DNAT技术的原理可以简单概括如下:

  1. 企业网关接收到目的地址为公网IP地址和端口号的数据包。
  2. 根据DNAT规则,企业网关将数据包的目标地址和端口号进行转换。
  3. 将被转换后的数据包发送给内部私有网络中指定的目标主机。
  4. 内部私有网络中的主机接收到数据包并进行相应的处理。

总之,DNAT技术将公网IP地址和端口号转换为内部私有网络中的主机地址和端口号,使得外部网络可以通过公网IP地址和端口号来访问内部主机,从而实现了外网访问内网的功能。

SNAT(Source Network Address Translation,源地址转换)是一种在网络层进行的地址转换技术,它是NAT(Network Address Translation,网络地址转换)的一种变形。SNAT技术可以将内部私有网络中的主机流量转换为一个公网IP地址和端口号。

具体来说,SNAT技术可以将内部主机的源IP地址和端口号转换为企业网关(或路由器)的公网IP地址和端口号,并将数据包发送给Internet上的目标主机。这样,在Internet上,接收方看到的源IP地址和端口号就是企业网关的公网IP地址和端口号,而不是内部主机的实际IP地址和端口号。

SNAT技术的原理可以简单概括如下:

  1. 内部主机向Internet上的目标主机发送数据包。
  2. 企业网关接收到数据包,并根据SNAT规则将源IP地址和端口号进行转换。
  3. 将被转换后的数据包发送给Internet上的目标主机。
  4. Internet上的目标主机接收到数据包,并进行相应的处理。

总之,SNAT技术将内部私有网络中的主机流量转换为企业网关的公网IP地址和端口号,使得外部网络可以通过企业网关的公网IP地址和端口号来访问内部主机,从而实现了内网访问外网的功能。

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

iptables是Linux系统中的一个防火墙工具,其可以用于配置和控制网络数据包的流动。其中,iptables的REDIRECT规则可以将一个数据包重定向到指定的目标地址和端口号。

iptables的REDIRECT规则实际上是通过DNAT(Destination Network Address Translation)技术来实现的。具体来说,它会将一个数据包的目标IP地址和端口号修改为指定的目标地址和端口号,并将修改后的数据包发送到该目标地址和端口号上。这样,在接收数据包的主机看来,数据包实际上是从目标地址和端口号发出的。

下面是一个常见的iptables REDIRECT规则示例:

iptables -t nat -A PREROUTING -d 192.168.1.5 -p tcp --dport 90 -j REDIRECT --to-port 80

该规则的作用是将所有经过TCP协议90端口的数据包,都重定向到TCP协议80端口上。这通常用于实现HTTP流量的透明代理,例如将HTTP请求重定向到Squid等代理服务器进行处理。

总之,iptables的REDIRECT规则可以将一个数据包重定向到指定的目标地址和端口号上,从而实现对网络数据流量的灵活控制。

18.firewalld常见区域总结

  • trusted 允许所有流量
  • home 拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义服务之外其它所有传入流量
  • internal 和home相同
  • work 拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其他所有传入流量
  • public 拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流量,新加的网卡默认属于public zone
  • external 拒绝除和传出流量相关的,以及ssh预定义服务之外的其他所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址
  • dmz 拒绝除和传出流量相关的,以及ssh预定义服务之外的其他所有传入流量
  • block 拒绝除和传出流量相关的所有传入流量
  • drop 拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应)

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

#!/bin/bash

# Allow traffic on ports 80, 443 and ssh from 192.168.1.0/24 network
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; }
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 tcp dport { 80, 443, 22 } ip saddr 192.168.1.0/24 accept
nft add rule inet filter input drop

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

  • 关系Relational:关系就是二维表,其中:表中的行,列次序不重要
  • 行Row:表中的每一行。又称为一条记录Record
  • 列column:表中的每一列,称为属性,字段,域field
  • 主键PrimaryKey:PK,一个或多个字段的组合,用于唯一确定一个记录的字段,一张表只有一个主键,主键字段不能为NULL
  • 唯一键Unique Key:一个或多个字段的组合,用于唯一确定一个记录的字段,一张表可以有多个UK,而且UK字段可以为NULL
  • 域Domain:属性的取值范围,如:性别只能是“男”和“女”两个值,人类的年龄只能0-150

21.总结关联类型,1对1,1对多,多对多关系。可以自行设计表进行解释

  1. 一对一关系

一对一关系表示两个表之间的每条记录都只能对应另一个表中的一条记录。例如,一个人只能有一个身份证号码,一个身份证号码也只能对应一位人员。这种关系通常在两个实体之间共享相同属性时使用。

  1. 一对多关系

一对多关系表示一个表中的每条记录可以对应另一个表中的多条记录,但是另一个表中的每条记录只能对应一个表中的记录。例如,一个客户可以有多个订单,但是一个订单只能对应一个客户。这种关系通常在一个实体可以拥有多个子实体时使用。

  1. 多对多关系

多对多关系表示两个表之间的每条记录都可以对应另一个表中的多条记录。例如,一个学生可以选修多门课程,一门课程也可以被多个学生选择。这种关系需要通过一个中间表来实现,中间表中包含两个表的主键作为外键,同时还包含其他相关信息。

22.总结MySQL设计范式

MySQL设计范式指的是关系型数据库设计中的三种规范化形式,也称为范式。这些规范化形式的目的是为了减小数据冗余和提高数据存储和查询的效率。

  1. 第一范式(1NF)

第一范式要求每个属性都是不可分割的原子值,即每个字段只能存储单一的数据内容,不允许存在多个值或者数组等复合数据类型。如果某个字段需要存储多个值,那么就应该将其拆分成独立的表。例如,如果有一个学生表,其中包含了多个手机号码,那么可以将其拆分成两个表,即学生表和学生手机号码表。

  1. 第二范式(2NF)

第二范式要求在满足1NF的基础上,每个非主键列都必须完全依赖于主键,而不能只依赖于主键的一部分。换句话说,每个表只能描述一个主题,不能存在部分依赖。例如,一个订单表中包含了订单号、顾客姓名和顾客地址等信息,其中顾客地址只依赖于顾客姓名而不依赖于订单号,因此可以将其拆分成两个表,即订单表和顾客表。

  1. 第三范式(3NF)

第三范式要求在满足2NF的基础上,每个非主键列都不能依赖于其它非主键列。换句话说,每个表只能描述一个主题,并且不存在传递依赖关系。例如,一个学生选课表中包含了学生姓名、课程名称和任课教师等信息,其中任课教师依赖于课程名称而不是学生姓名,因此可以将其拆分成三个表,即学生表、课程表和任课教师表。

需要注意的是,范式规范化设计虽然可以减少数据冗余和提高数据库的性能,但是在实际应用中也存在一些缺点,比如需要增加多个表和关联操作,导致查询语句变得复杂,同时也会增加数据库的维护难度。因此,在设计数据库时需要根据实际情况进行取舍和权衡。

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

安装方式:

  • 通过包管理器安装
  • 源代码编译安装
  • 二进制格式的程序包
  • Docker容器安装

#通过包管理器安装
dnf install mysql-community-server
systemctl enable --now mysqld

#查看日志,获得初始生成的root密码
grep password /var/log/mysqld.log

#二进制包安装
groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 -d /data/mysql mysql

mkdir -p /data/mysql
chown mysql:mysql  /data/mysql

tar xf mysql-VERSION-linux-x86_64.tar.gz	-C	/usr/local
cd /usr/local
ln -sv	mysql-VERSION mysql
chown -R	root:root	/usr/local/mysql/

#配置文件
cd /usr/local/mysql
cp -b support-files/my-default.cnf		/etc/my.cnf
vim /etc/my.cnf
[mysqld]
datadir = /data/mysql
innodb_file_per_table = on
skip_name_resolve = on


#数据库初始化
cd /usr/local/mysql/
./scripts/mysql_install_db --datadir = /data/mysql  --user=mysql

#准备服务配置文件并启动
cp /usr/local/mysql/support-files/mysql.service /usr/lib/systedm/system/
systemctl daemon-reload
systemctl enable --now mysqld

#设置环境变量
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d.mysql.sh

#安全加固
/usr/local/mysql/bin/mysql_secure_installation

#源码编译安装MySQL

dnf install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-dvel perl-Data-Dumper

useradd -r -s /sbin/nologin -d /data/mysql mysql

mkdir /data/mysql
chown mysql:mysql /data/mysql

tar xvf mysql-5.6.51.tar.gz -C /usr/local/src

cd mysq1-5.6.51/
cmake . \
-DCMAKE_INSTALL_PREFIX=/apps/mysql \
-DMYSQL_DATADIR=/data/mysq1/ \
-DSYSCONFDIR=/etc/ \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE__ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=O \
-DENABLED_LOCAL__INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_CHARS-DDEFAULT_COLLATTON=utf8_general_ci
make -j 8 && make install

echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d.mysql.sh

cd /apps/mysql/
scripts/mysql_install_db --datadir=/data/mysql  --user=mysql

cp /usr/local/mysql/support-files/mysql.service /usr/lib/systedm/system/
systemctl daemon-reload
systemctl enable --now mysqld

通过运行脚本mysql_secure_installation安全加固:

  • 设置数据库管理员root口令
  • 禁止root远程登录
  • 删除anonymous用户账户
  • 删除test数据库
  • 限制数据存储路径:在配置文件中限制数据目录和日志文件的存储路径,并且保证只有MySQL进程有访问权限。
  • 开启SSL连接:SSL连接可以确保连接的安全性,防止数据被黑客窃取或篡改。启用SSL连接需要证书和密钥,同时也需要在MySQL配置文件中进行相应设置。
  • 限制SQL命令的执行:黑客attack常常通过注入恶意SQL语句来实现,因此必须限制对SQL命令的执行。可以采用参数化查询或预编译的方式,对输入的参数进行检查和转义,以防止SQL注入attack。
  • 定期备份数据:无论多么安全的系统都可能出现事故,因此必须定期备份MySQL数据库的数据和日志。可以将备份数据存储在不同的服务器或云存储平台中,以确保数据在系统崩溃或受到attack时能够恢复。

MySQL的配置文件是一个文本文件,通常名为my.cnf或者my.ini(在Windows系统下)。它包含了MySQL数据库运行时的各种参数和选项,可以通过修改配置文件来改变MySQL的行为和性能。

以下是MySQL配置文件的主要内容:

  1. [client]:此段定义了客户端连接MySQL服务器的选项和默认值。例如,可以设置默认的字符编码、端口号、连接超时时间等。
  2. [mysqld]:这是MySQL服务器的用到的大部分配置,比如存储位置、缓存选项、日志设置、安全选项等等。在这一段可以设置多种选项并且重写相应的全局默认值。
  3. [mysql]:这一部分定义了mysql命令行工具的选项和默认值,如默认的字符集、用户名和密码等。
  4. [mysqldump]:这一部分定义了mysqldump备份工具的选项和默认值,如备份时跳过某些表、压缩级别等。
  5. [mysqladmin]:这一部分定义了mysqladmin管理工具的选项和默认值,如默认的字符集、用户名、密码等。
  6. [mysqld_safe]:这是MySQL服务器启动脚本的选项和默认值,如启动时间超时限制、内存限制等。
  7. [MariaDB]:这是MariaDB特有的配置段,MariaDB是MySQL的一个分支,此部分定义了MariaDB独有的配置选项。

MySQL的配置文件中的每个参数都有默认值,可以在需要时进行修改,并且可以通过命令行工具或者GUI工具来修改MySQL的配置文件。修改配置文件是调整MySQL性能和行为的重要方法之一,需要仔细考虑各种参数对系统的影响,并进行适当的实验和测试。

举报

相关推荐

0 条评论