【linux】

1.openssh

OpenSSH 是一种让用户安全访问远程系统的网络协议,为不安全网络中的两台主机提供了一个强加密数据通信通道。作为 Linux 和 UNIX 系统管理员操作和管理主机的首选方式,SSH 比其他通信方式更加安全

1.1安全策略

更新和配置 SSH 配置文件:

  1. 编辑 OpenSSH 服务器主配置文件(通常位于 /etc/ssh/sshd_config)
  2. 禁用 root 登录,并使用普通用户登录后再切换到 root 用户
  3. 禁用密码身份验证,仅允许密钥身份验证
  4. 配置 SSH 端口转发,以限制端口转发的使用
  5. 设置登陆会话超时时间以防止不活动的会话占用系统资源
  6. 置防火墙规则以允许通过 SSH 访问的 TCP 端口(默认为端口 22)
  7. 使用密钥身份验证(公钥/私钥对)而不是密码身份验证。确保私钥文件具有适当的权限并定期更新密钥

1.2openssh免密认证

  1. 生成密钥对:首先,在客户机上生成一对密钥,包括公钥和私钥。这通常使用 ssh-keygen 命令来完成
  2. 将公钥传给远程机器:将生成的公钥传输到要免密登录的远程主机
  3. 这种免密登录的原理基于非对称加密,确保了安全性。在实际应用中,我们需要将客户机的公钥添加到远程服务器的可信列表中,以便实现免密登录
    请求加密的过程:
    1.当客户机尝试登录到远程主机时,远程主机会向客户机发送一个随机字符串。
    2.客户机使用自己的私钥对该随机字符串进行加密,并将加密后的结果发送回远程主机。
    3.远程主机使用客户机的公钥解密接收到的密文,并将解密的结果与之前生成的随机字符串进行比较。
    4.如果匹配成功,客户机将被授权登录
    示例:
#默认Ubutu和Rocky都安装了openssh-server
[17:39:26root@ubuntu ~]# ssh-keygen -P "" -f /root/.ssh/id_rsa #在本机生成一个没有密码的密钥对
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:wusSpRK82FrETJo66nQIweLx6NidcGbkC9/8EkuMnUo root@ubuntu
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|. .              |
|oX  .            |
|=.Xo ..          |
|o*o+=*o.S        |
|B.*OE=*o         |
|oB.+=++o         |
|+ . o.o.         |
|..   ....        |
+----[SHA256]-----+
[17:51:48root@ubuntu ~]# sshpass -p '123456' scp -o StrictHostKeyChecking=no -r /root/.ssh root@10.0.0.22:
#把公钥文件发送发指定服务器
[17:51:53root@ubuntu ~]# ssh 10.0.0.22
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-167-generic x86_64)
#链接上了

脚本:

OS_ID=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+).*"$@\1@p' /etc/os-release`
PASS="123456"
END="254"
IP=`ip a |sed -nr 's/^.*inet ([0-9.]+)\/[0-9]+ brd.*/\1/p'`
NET=${IP%.*}.
color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_BLUE="echo -en \\033[1;34m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    ${SETCOLOR_BLUE} "$1" && $MOVE_TO_COL
    ${SETCOLOR_NORMAL}
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}
environment () {
    rm -rf /root/.ssh &>/dev/null
    [ -e ./SCANIP.log ] && rm -f SCANIP.log
    for((i=3;i<="$END";i++));do
        ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
    done
    wait
    if [[ $OS_ID =~ Centos|Rocky ]];then
        rpm -q sshpass &>/dev/null || yum -y install sshpass
        [ $? -eq "0" ] || { color "安装sshpass失败" 1 ;exit; }
    elif [[ $OS_ID =~ Ubuntu ]];then
        dpkg -l sshpass &> /dev/null ||{ apt update; apt -y install sshpass; }
        [ $? -eq "0" ] || { color "安装sshpass失败" 1 ; exit; }
    fi
}
key () {
    ssh-keygen -P "" -f /root/.ssh/id_rsa &>/dev/null
    sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP &>/dev/null
    #使用 sshpass 工具将本地的 SSH 公钥复制到指定 IP 地址的远程主机上,同时忽略主机密钥的严格检查
    AliveIP=(`cat SCANIP.log`)
	for n in ${AliveIP[*]};do
    	sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}: &>/dev/null
		color ${n} 0
	done
	#把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入回车
	mian () {
    environment
    key
}
mian
}

2.sudo

sudo 是 Unix 和类 Unix 操作系统中的一种命令,允许系统管理员授予普通用户以执行特定任务或命令的权限。sudo 的配置文件通常是 /etc/sudoers 文件。下面是 sudo 配置文件的格式以及一些示例:
sudo 配置文件格式:
sudo 配置文件的语法比较特殊,主要由一系列的条目组成,每个条目包含了一个用户或用户组、一个主机列表、一个命令别名或一个别名的别名以及一系列的命令规范。配置文件的语法比较严格,一般建议使用 visudo 命令来编辑,以避免语法错误。
示例:
1.授权用户指定的命令权限:

user1    ALL=(ALL) /usr/bin/apt-get update

2.授权用户在指定目录下执行所有权限:

user2    ALL=(ALL) /usr/bin/cat /var/www/*
#这个是有bug的,这样也可以查看到里面的内容
cat /var/www/11   /etc/passwd
#更改为:
user2 ALL=(ALL) /usr/bin/cat ^/var/log/[a-zA-Z0-9]+$

3.授予用户无密码执行命令的权限:

user3    ALL=(ALL) NOPASSWD: /sbin/reboot

4.授予用户组执行所有命令的权限,等同于root:

%group1   ALL=(ALL) ALL

3.PAM架构

PAM(Pluggable Authentication Modules,可插拔认证模块)是一个用于认证服务的系统架构,它允许系统管理员配置灵活的认证方法,并提供了一种标准化的方式来实现认证、授权和账户管理功能。下面是 PAM 架构及其工作原理的总结:

PAM 架构:

PAM 架构主要由四个组件组成:

1.应用程序(Applications): 需要进行身份验证、授权或账户管理的应用程序或服务。
2.PAM 库(PAM Library): 提供了 PAM 接口的库,应用程序通过调用这些库来与 PAM 进行通信。
3.PAM 配置文件(PAM Configuration Files): 存储了针对特定应用程序的认证、授权和账户管理的规则和设置。
4.认证模块(Authentication Modules): 实际执行身份验证的模块,可以是本地密码验证、基于 LDAP 的认证、双因素认证等。

工作原理:

PAM 的工作原理可以分为以下几个步骤:

1.应用程序调用: 当一个应用程序需要进行身份验证、授权或账户管理时,它会调用 PAM 库提供的 API。
2.PAM 堆栈处理: PAM 库根据应用程序的请求,查找并加载相应的 PAM 配置文件。配置文件定义了一系列 PAM 模块的堆栈,每个模块负责执行特定的任务,如认证、授权或账户管理。
3.模块执行: PAM 框架按照配置文件中定义的顺序依次执行堆栈中的各个模块。每个模块都会根据其配置返回一个状态,通常是成功、失败或跳过。如果一个模块失败了,PAM 框架可以根据管理员配置的策略来决定是否继续执行后续模块。
4.结果返回: 当所有模块都执行完毕后,PAM 框架会根据各个模块的返回状态来判断整个身份验证过程是否成功。如果所有模块都返回成功,则 PAM 框架会通知应用程序身份验证成功,否则会返回失败信息。

总结:

PAM 架构提供了一种灵活和可定制的方式来实现认证、授权和账户管理功能。通过合理配置 PAM 配置文件,系统管理员可以根据实际需求定制认证策略,并使用各种认证模块来实现多种认证方式。这使得 PAM 成为了许多 Unix 和类 Unix 系统中广泛应用的认证框架。

3.1PAM配置文件格式,模块

PAM 配置文件格式:

PAM 配置文件通常存储在 /etc/pam.d/ 目录下,每个配置文件对应一个特定的应用程序或服务。PAM 配置文件的格式如下

type control module-path module-arguments

type: 表示要执行的操作类型,如认证(auth)、授权(account)、密码管理(password)和会话管理(session)等。
control: 定义了模块的执行方式,常见的控制方式包括 required(必须成功)、sufficient(满足一个即可)、optional(可选的)和requisite(必须执行,但是不返回成功也可以)等。
module-path: 指定了要执行的认证模块的路径或名称。
module-arguments: 模块执行时可能需要的参数,可以根据模块的要求来指定。

示例:
1.nologin 模块:

vim /etc/pam.d/login
auth    required    pam_nologin.so
#这个示例中,pam_nologin 模块被配置在 auth 类型中,表示在身份验证过程中检查是否存在 /etc/nologin 文件,如果存在则发送文件里面的内容,拒绝用户登录

2.limits 模块:

#限制资源模块
vim /etc/security/limits.conf
#建议成产案例
*                soft    core            unlimited #core文件大小
*                hard    core            unlimited
*                soft    nproc           1000000 #最大运行进程数
*                hard    nproc           1000000
*                soft    nofile          1000000 #最大可以打开的文件数量
*                hard    nofile          1000000
*                soft    memlock         32000 #最大可用内存空间
*                hard    memlock         32000
*                soft    msgqueue        8192000 #最大消息队列数
*                hard    msgqueue        8192000
这个示例中,pam_limits 模块被配置在 session 类型中,表示在用户会话开始时应用资源限制,例如 CPU 时间、内存、文件打开数等。
ulimit -a #查看模块功能的列表
ulimit -n #限制同时访问资源打开的个数;临时更改

4.私有时间服务器

#!/bin/bash
#
#**********************************************************************************************
#Author:        luomu
#Date:          2024-03-06
#FileName:      ntp.sh
#Description:   The test script
#Copyright (C): 2024 All rights reserved
#*********************************************************************************************
OS_ID=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+).*"$@\1@p' /etc/os-release`
color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_BLUE="echo -en \\033[1;34m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    ${SETCOLOR_BLUE} "$1" && $MOVE_TO_COL
    ${SETCOLOR_NORMAL}
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}
time_datectl () {
    if [[ $OS_ID =~ Rocky|CentOS ]];then
        rpm -q chrony &>/dev/null || yum -y install chrony
        systemctl enable --now chronyd.service &>/dev/null
        sed -e 's/^pool/#pool/' \
            -e '/^#pool/a\server ntp.aliyun.com iburst ' \
            #这里是与互联网时间同步的网址可以更改
            -e '/^#pool/a\server time1.cloud.tencent.com iburst' \
            -e '/^#pool/a\server ntp.tuna.tsinghua.edu.cn iburst' \
            -e 's/^#allow.*/allow 10.0.0.0\/24/' \
            -e 's/^#local/local/' \
            -i.bask \
            /etc/chrony.conf
         systemctl restart chronyd.service
         [ $? -eq 0 ] && color 完成外网时间同步 0
    elif [[ $OS_ID =~ Ubuntu ]];then
        dpkg -l chrony &>/dev/null || { apt update; apt -y -q  install chrony; }
        systemctl enable --now chronyd.service &>/dev/null
        sed -e 's/^pool/#pool/' \
            -e '/ntp.ubuntu.com/i\server ntp.aliyun.com iburst' \
            -e '/ntp.ubuntu.com/i\server time1.cloud.tencent.com iburst' \
            -e '/ntp.ubuntu.com/i\server ntp.tuna.tsinghua.edu.cn iburst' \
            -e '$a\allow 10.0.0.0/24' \
            -e '$a\local stratum 10' \
            -i.bask \
            /etc/chrony/chrony.conf
        systemctl restart chronyd.service
        [ $? -eq 0 ] && color 完成外网时间同步 0
    else 
        color 不支持此系统 1
    fi
}
time_datectl
#需要开放UDP123端口
#客户端需要开放323端口

5.DNS域名

DNS(Domain Name System,域名系统)是互联网中用于将域名解析为 IP 地址的分布式数据库系统。它的工作原理可以简单概括为客户端发起查询请求,DNS 服务器根据查询请求返回相应的记录

域名三级结构

域名的三级结构是指域名的层次结构,它通常由三个部分组成,分别是顶级域(Top-Level Domain,TLD)、二级域(Second-Level Domain)和子域(Subdomain)

  1. 顶级域(Top-Level Domain,TLD): 顶级域是域名中的最高级别,通常表示国家、地区或特定类型。例如,.com、.org、.net 是常见的通用顶级域,而像 .cn、.uk、.us 则表示国家代码顶级域。在域名的三级结构中,顶级域位于最右侧,是整个域名的最高级别
  2. 二级域(Second-Level Domain): 二级域是位于顶级域之下的一级域名。它通常用于表示组织、公司、机构或个人的名称。例如,在域名 example.com 中,“example” 就是二级域名。二级域名是在顶级域的范围内注册的,它是许多网站和电子邮件地址的一部分
  3. 子域(Subdomain): 子域是位于二级域之下的域名分支。它是二级域名的一部分,可以用来进一步细分和组织网站内容。例如,在域名 www.example.com 中,“www” 就是子域,通常用于表示网站的主页。除了 “www” 外,还可以使用其他任意子域,如 blog.example.com、mail.example.com 等

DNS工作原理,迭代和递归

  1. 域名解析请求: 当用户在浏览器中输入一个域名时,操作系统会向本地 DNS 解析器发起域名解析请求。
  2. 本地 DNS 解析器: 本地 DNS 解析器首先检查本地缓存中是否有与请求域名相关的记录。如果有,它会直接返回相应的 IP 地址
  3. 递归查询: 如果本地缓存中没有相应记录,本地 DNS 解析器将发起一个递归查询请求,向根域名服务器查询请求
  4. 根域名服务器: 根域名服务器负责维护顶级域名服务器(如 .com、.net、.org 等)的地址信息。当根域名服务器接收到请求后,它会返回指向相应顶级域名服务器的 IP 地址
  5. 顶级域名服务器: 顶级域名服务器负责维护二级域名服务器(如 .com 域名下的域名服务器)的地址信息。当接收到请求后,它会返回指向相应二级域名服务器的 IP 地址
  6. 权威域名服务器: 最终,权威域名服务器负责维护该域名的 IP 地址信息。当权威域名服务器接收到查询请求时,它会返回相应的 IP 地址给本地 DNS 解析器
  7. 本地 DNS 解析器返回结果: 本地 DNS 解析器收到来自权威域名服务器的响应后,将结果返回给用户的操作系统,然后操作系统将 IP 地址返回给浏览器,浏览器利用这个 IP 地址建立与服务器的连接
    迭代和递归查询:
    迭代查询: 在迭代查询中,DNS 解析器向 DNS 服务器发起查询请求,并要求服务器给出最佳的答案。如果 DNS 服务器无法立即提供答案,则它会将请求转发给其他 DNS 服务器,并将这些中间结果返回给 DNS 解析器,以便解析器继续向其他服务器发起查询。这个过程会重复多次,直到找到最终的答案或者达到查询超时。
    递归查询: 在递归查询中,DNS 解析器向 DNS 服务器发起查询请求,并要求服务器为其解析整个域名链。DNS 服务器会负责迭代地向其他服务器查询,直到找到最终的答案,并将该答案返回给 DNS 解析器。DNS 解析器不需要了解查询的具体细节,只需要等待最终结果即可。
    总结:
    递归查询是 DNS 解析器向 DNS 服务器发起的请求类型,而迭代查询则是 DNS 服务器向其他服务器发起的请求类型。在 DNS 工作过程中,通常使用这两种类型的查询来查找和解析域名

实现私有DNS

#定义域名为luomu.com
[17:57:56root@ubuntu ~]# apt install -y bind9 bind9-utils bind9-host
[20:14:39root@ubuntu ~]# dpkg -l bind9-utils
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version                    Architecture Description
+++-==============-==========================-============-=================================
ii  bind9-utils    1:9.16.48-0ubuntu0.20.04.1 amd64        Utilities for BIND 9
[20:18:49root@ubuntu ~]# sed -i 's/dnssec-validation auto/dnssec-validation no/' /etc/bind/named.conf.options
#禁用 DNSSEC 验证
[20:18:49root@ubuntu ~]# vim /etc/bind/named.conf.default-zones
zone "luomu.com" IN {
    type master;
    file  "/etc/bind/luomu.com.zone";
};
[20:20:36root@ubuntu ~]# vim /etc/bind/luomu.com.zone
@    IN SOA   master admin (
                    1   ; serial
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H )    ; minimum
            NS   master
master      A    本机ip               
www         A    本地服务ip
chgrp bind  /etc/bind/luomu.com.zone #加载配置文件
[20:25:14root@ubuntu ~]# systemctl start named
#启动服务

6.iptables

iptables 是 Linux 中用于配置和管理 IPv4 包过滤和网络地址转换的工具。它允许系统管理员定义规则,控制入站和出站流量,实现网络安全和路由策略

6.1五表五链

表(Tables):
filter 表:
主要用于过滤和阻止数据包。常见的链包括 INPUT、FORWARD 和 OUTPUT。
nat 表:
主要用于网络地址转换(NAT)。常见的链包括 PREROUTING、POSTROUTING 和 OUTPUT。
mangle 表:
主要用于修改数据包的 IP 头信息。常见的链包括 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING。
raw 表:
主要用于配置数据包的处理方式。常见的链包括 PREROUTING 和 OUTPUT。
security 表:
主要用于 SELinux 的安全标签处理。
链(Chains):
INPUT 链:
用于处理进入系统的数据包。
FORWARD 链
用于转发通过系统的数据包。
OUTPUT 链:
用于处理从系统发出的数据包
基本使用:

#查看规则
[20:30:40root@ubuntu ~]# iptables -nvL
Chain INPUT (policy ACCEPT 38 packets, 2184 bytes)
 pkts bytes target     prot opt in     out     source               destination         
#清除规则
[20:30:45root@ubuntu ~]# iptables -F
#允许特定端口访问
[20:35:15root@ubuntu ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#拒绝指定IP
[20:35:22root@ubuntu ~]# iptables -A INPUT -s 10.0.0.100 -j DROP

6.2 NAT转换原理

Network Address Translation(网络地址转换,NAT)是一种用于在私有网络和公共网络之间转换 IP 地址的技术。它在路由器或防火墙上执行,允许多个主机共享单个公共 IP 地址,并提供一定程度的安全性
NAT 转换原理:
NAT 转换通常在路由器或防火墙上实现。当数据包从内部网络传输到外部网络时,它们的源 IP 地址会被转换为路由器或防火墙的公共 IP 地址。当数据包从外部网络传输到内部网络时,目标 IP 地址会被转换为内部网络中的私有 IP 地址

6.2.1SNAT

SNAT 是一种将内部主机的私有 IP 地址映射到公共 IP 地址的 NAT 转换。当内部主机发送数据包到外部网络时,路由器或防火墙会将数据包的源 IP 地址替换为公共 IP 地址,并将此映射信息存储在 NAT 表中。当响应数据包返回时,路由器或防火墙将公共 IP 地址转换回对应的私有 IP 地址
实现:

#注意: 需要开启 ip_forward
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9 
#除了10网段源地址访问非10w网段的目标地址就转到指定的公网ip

6.2.3DNAT

DNAT 是一种将外部网络中的公共 IP 地址映射到内部网络中的私有 IP 地址的 NAT 转换。当外部网络中的数据包传输到内部网络时,路由器或防火墙会将数据包的目标 IP 地址替换为对应的内部主机的私有 IP 地址,并将此映射信息存储在 NAT 表中

iptables -t nat -A PREROUTING -d 192.168.10.48 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.7:80
#访问192.168.10.48端口的的tcp协议的80端口就通过DNAT转到本地的10.0.0.7的80端口
  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值