分类 Technology 下的文章

以下内容来自DeepSeek

证书最初可能是通过 certbot certonly --manual(手动交互模式)申请的,这种方式需要人工操作(如手动添加DNS记录或HTTP验证文件)。
自动续订时,Certbot 会尝试使用相同的插件(manual),但非交互模式下必须通过 --manual-auth-hook 提供自动化验证脚本,否则会失败。

解决方案
如果不需要手动验证(如DNS验证),改用 webroot 或 standalone 模式重新申请证书:

删除旧证书配置:
bash
sudo certbot delete --cert-name <sitedomain>
重新申请证书(以 webroot 模式为例) :
bash
sudo certbot certonly --webroot -w /var/www/html -d <sitedomain>
-w /var/www/html: 指定网站根目录(根据你的实际路径修改)。
-d <sitedomain>: 你的域名。
后续自动续订:
bash
sudo certbot renew --quiet
webroot 模式无需停止Web服务,适合自动化续订。

☁  ~  sudo certbot delete --cert-name <sitedomain>
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certificate(s) are selected for deletion:

  * <sitedomain>

WARNING: Before continuing, ensure that the listed certificates are not being
used by any installed server software (e.g. Apache, nginx, mail servers).
Deleting a certificate that is still being used will cause the server software
to stop working. See https://certbot.org/deleting-certs for information on
deleting certificates safely.

Are you sure you want to delete the above certificate(s)?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: yes
Deleted all files relating to certificate <sitedomain>.
☁  ~  sudo certbot certonly --webroot -w /var/www/html -d <sitedomain>
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for <sitedomain>

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/<sitedomain>/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/<sitedomain>/privkey.pem
This certificate expires on 2025-07-02.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
☁  ~  sudo certbot renew --quiet

结构化数据是指按照一定的规则或格式组织存储的数据,例如数据库中的表格、电子表格、XML文件等。结构化数据具有以下特点:

易于查询和分析。由于结构化数据有明确的字段、类型和关系,可以使用标准的语言(如SQL)或工具(如Excel)进行快速有效的查询和分析。占用空间较小。由于结构化数据避免了重复和冗余的信息,可以节省存储空间。需要预定义模式。为了实现结构化存储,需要事先定义好数据的模式(schema),即确定好每个字段的名称、类型、长度等属性。这样做可以保证数据的一致性和完整性,但也限制了数据的灵活性和扩展性。
非结构化数据是指没有固定格式或规则组织存储的数据,例如文本、图像、音频、视频等。非结构化数据具有以下特点:

难以查询和分析。由于非结构化数据没有统一的字段、类型和关系,不能直接使用标准的语言或工具进行查询和分析。需要使用特定的方法(如自然语言处理、计算机视觉等)提取出有效信息。占用空间较大。由于非结构化数据包含了大量无关或冗余信息,占用了更多存储空间。不需要预定义模式。非结构化数据不受任何模式约束,可以随意添加或修改任何内容。这样做可以提高了灵活性和扩展性,但也降低了一致性和完整性。
半结构化数据是一种介于结构化数据和非结构化数据之间的数据类型,它不符合传统的关系型数据库或表格的格式,但是有一定的组织和规则,可以用标记、标签、键值对等方式表示数据的层次和语义。半结构化数据在现实生活中很常见,例如XML、JSON、HTML等文件格式,以及日志、电子邮件、社交媒体等文本信息。

半结构化数据相比于结构化数据,具有更大的灵活性和可扩展性,可以适应不同的场景和需求,不受固定模式或架构的限制。半结构化数据也相比于非结构化数据,具有更高的可读性和可处理性,可以通过一些工具或方法提取出有用的信息和知识,进行分析和挖掘。

手册 https://qref.sourceforge.net/Debian/reference/ch-preface.zh-cn.html
WIKI https://wiki.debian.org/zh_CN/FrontPage


昨天大扫除,老黄给了我一只英雄牌的钢笔
又想练字了

2024.12.23本站成功复活

1.update apt
2.install zsh oh-my-zsh manpages-zh
3.config zsh-plugin
4.install apache php
5.config /etc/apache2/site-available #配置域名映射,以及ssl证书
5.test apache testing page
6.install typecho
7.config typecho
8.restore backup


zsh不会默认执行~/.profile,只有sh/bash会执行该配置。

IMG_4570.png

几乎每次跟新都会有问题。

certbot每次生成的新证书会放在/etc/letsencrypt/archive/<site-domain>-0001/下面,这个0001会随着次数增加,所以每次更新的证书都不是在apache原配置文件指向的位置,所以得更新。
(certbot生成的结果一般显示/etc/letsencrypt/live/...,但实际上这里只保存软连接,真实文件在archive下)

sudo nano /etc/apache2/sites-available/default-ssl.conf

有时候是什么000-default-ssl.conf文件,自己辨别一下
比如我有次更新的是:

        ServerName grav1ty.cn
        # 使得 Apache 能够识别来自该域名的请求

        SSLCertificateFile /etc/letsencrypt/live/<site-domain>-0002/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/<site-domain>-0002/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
        # 包含了 Let’s Encrypt 提供的 SSL 配置选项,这通常是推荐的做法,可以提高 SSL 配置的安全性

把里面0002换成0003即可。

检查的时候可以用

openssl s_client -connect :443
查看证书信息,不用每次用浏览器还要清空缓存什么的。

另记:

        SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key

这是apache默认的文件。


此次更新archlinux,又出现了kwallet输入密码且wifi密码需要重新输入的问题。
kwallet是kde管理密码的工具,不只是钱包。
解决办法是

yay -S kwallet-pam

更新报错

xxx签名未知/已过期/不受信任

解决方法

sudo pacman -S archlinux-keyring
sudo pacman-key --refresh-keys
sudo pacman-key --init
sudo pacman-key --populate
sudo pacman -Scc

然后再次更新即可


更新发现KDE只支持2K60Hz,但显示器支持2K165Hz。

#生成一个模型ine,然后使用输出结果中的信息添加模式
cvt 2560 1440 165

#eg.
☁  ~  cvt 2560 1440 165

# 2560x1440 164.90 Hz (CVT) hsync: 261.86 kHz; pclk: 938.50 MHz
Modeline "2560x1440_165.00"  938.50  2560 2792 3072 3584  1440 1443 1448 1588 -hsync +vsync
#!/bin/bash
# 添加新模式: 使用生成的模型线来添加新的显示模式
xrandr --newmode "2560x1440_165.00"  938.50  2560 2792 3072 3584  1440 1443 1448 1588 -hsync +vsync
# 将模式添加到显示器: 然后将该模式添加到你的HDMI-A-2输出
xrandr --addmode HDMI-A-2 "2560x1440_165.00"
# 切换到新的模式
xrandr --output HDMI-A-2 --mode "2560x1440_165.00"

如果还无效,尝试添加或修改X配置/etc/X11/xorg.conf.d/10-monitor.conf:

Section "Monitor"
    Identifier "HDMI-A-2"
    Modeline "2560x1440_165.00"  938.50  2560 2792 3072 3584  1440 1443 1448 1588 -hsync +vsync
    Option "PreferredMode" "2560x1440_165.00"
EndSection

Section "Screen"
    Identifier "Screen0"
    Monitor "HDMI-A-2"
EndSection

另记:
使用 sudo systemctl restart display-manager 会重启图形登录管理器,这将导致当前用户的会话被终止,并结束所有与该用户相关的进程。这样会关闭所有打开的应用程序和窗口,所以在执行此命令之前,最好先保存你的工作并关闭不需要的程序。

原文:https://www.cnblogs.com/wspblog/p/4710617.html

rc.d的内容如下:
init.d/ :各种服务器和程序的二进制文件存放目录。
rcx.d/: 各个启动级别的执行程序连接目录。里头的东西都是指向init.d/的一些软连接。具体的后边叙述。
还有三个脚本:rc.sysinit, rc, rc.local

redhat的启动方式和执行次序是:
加载内核
执行init程序
/etc/rc.d/rc.sysinit # 由init执行的第一个脚本
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
/etc/rc.d/rc.local
/sbin/mingetty # 等待用户登录

在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
调入keymap以及系统字体
启动swapping
设置主机名
设置NIS域名
检查(fsck)并mount文件系统
打开quota
装载声卡模块
设置系统时钟
等等。

/etc/rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以设置)来执行相应目录下的脚本。凡是以Kxx开头的
,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的顺序按xx
从小到大来执行。例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用
/etc/rc.d/rc3.d/下的脚本。
值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中
的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。

init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc的
action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。
至此,LINUX的启动结束。

本文如无特殊解释,init.d指的就是/etc/rc.d/init.d目录。

本文包括3部分内容
1、 Linux的引导过程
2、 运行级别
3、 /etc/rc.d/ 与/etc/rc.d/init.d的关系

/etc/rc.d/init.d/目录下的脚本就类似与windows中的注册表,在系统启动的时候某些指定脚本将被执行”。开始之前,先引用李善明经理昨天晚上总结时的一个理解,让大家先对init.d目录有个大概的印象。在进入init.d之前,我们一起来做两个准备工作,linux的引导过程和运行级别的概念。

一、Linux的引导过程
系统加电之后,首先进行的硬件自检,然后是bootloader对系统的初始化,加载内核。

内核被加载到内存中之后,就开始执行了。一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化。从这里开始,内核就能够挂装根文件系统(这个过程类似于Windows识别并存取C盘的过程)。内核挂装了根文件系统,并已初始化所有的设备驱动程序和数据结构等之后,就通过启动一个叫init的用户级程序,完成引导进程。

二、运行级别(run level)
Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。 init进程上来首先做的事是去读取/etc/目录下inittab文件中initdefault id值 ,这个值称为运行级别(run-level)。它决定了系统启动之后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具有不同的功能。不同的运行级定义如下:

# 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)
# 1 - 单用户模式
# 2 - 多用户,没有 NFS
# 3 - 完全多用户模式(标准的运行级)
# 4 – 系统保留的
# 5 - X11 (x window)
# 6 - 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )

三、/etc/rc.d/与/etc/rc.d/init.d的关系
写到这里,应该差不多要进入init.d了,可是我觉得单写/etc/rc.d/init.d的话不一定能说得清楚明白,就拿它跟/etc/rc.d这个它上一级的目录一起来讨论,可能比较合适一些,因为他们之间有着千丝万缕的关系。

在这里先解释一下init.d里面放的都是什么东西。这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。

前面说到,/etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别),相信从命名的角度大家也能猜到该运行/etc/rc.d/init.d里面的脚本了,不然它为什么也叫init(.d)呢是吧。没错,是该运行init.d里的脚本了,但是并不是直接运行,而是有选择的因为系统并不需要启动所有的服务。

那么,系统是如何选择哪些需要启动哪些不要呢?这时刚才说的运行级别就起作用了。

在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。在RH9和FC7的源码中它都是一上来就check_runlevel()(虽然实现的代码不一样,也大同小异),知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活的init.d里的脚本。

到这里,估计大家可能都比较清楚了,我开始也以为是这样的。可是后来我仔细看过和比较这些链接文件和init.d里真正被执行的脚本的文件名之后,一直有几个问题没弄明白。借着写这个文章的机会,我做了一些功课,总算是大概解开了那些疑惑。

1、这些链接文件前面为什么会带一个Kxx或者Sxx呢?
是这样的,带K的表示停止(Kill)一个服务,S表示开启(Start)的意思

2、K和S后面带的数字呢?干什么用的
这个我开始的时候还以为是排列起来好看或者数数用呢(是不是很幼稚?)。后来发现不是的。它的作用是用来排序,就是决定这些脚本执行的顺序,数值小的先执行,数值大的后执行。很多时候这些执行顺序是很重要的,比如要启动Apache服务,就必须先配置网络接口,不然一个没有IP的机子来启动http服务那岂不是很搞笑。

3、无意中我发现同一个服务带S的和带K的链接到init.d之后是同一个脚本。我就纳闷了,为什么会是执行同一个脚本呢?
这个时候真是S和K的妙用了,原来S和K并不止是用来看起来分的清楚而已。S给和K还分别给init.d下面的脚本传递了start和stop的参数。哦,是这样的(焕然大悟的样子,呵呵)!这时我才想起来原来曾经无数用过的/etc/rc.d/init.d/network restart命令。原来传S时相当于执行了/etc/rc.d/init.d/xxx start这条命令,当然K就相当于/etc/rc.d/init.d/xxx stop了。

几种常见的DNS攻击

1. DNS Spoofing:攻击者通过伪造DNS响应,将用户重定向到恶意网站或者欺骗用户输入敏感信息。
2. DNS Cache Poisoning:攻击者通过向DNS服务器发送虚假的DNS响应,将错误的IP地址缓存到DNS服务器中,导致用户无法访问正确的网站。
3. DNS Amplification:攻击者利用DNS服务器的放大效应,向目标服务器发送大量的DNS请求,导致目标服务器瘫痪。
4. DNS Flood:攻击者通过向DNS服务器发送大量的DNS请求,消耗服务器资源,导致服务器瘫痪。
5. DNS Tunneling:攻击者通过DNS协议传输非法数据,绕过网络安全设备,实现数据窃取或者远程控制。

辨析:

DNS Spoofing 和 DNS Cache Poisoning 的区别

攻击对象:
DNS Spoofing:主要针对用户或客户端,通过伪造DNS响应直接影响用户的DNS查询结果。
DNS Cache Poisoning:主要针对DNS服务器的缓存,通过污染缓存来影响多个用户的查询结果。
实现方式:
DNS Spoofing:通常涉及实时拦截和篡改DNS请求或响应。
DNS Cache Poisoning:通过发送虚假的DNS响应使DNS服务器缓存错误的IP地址。
DNS Amplification和DNS Flood是两种不同的拒绝服务(DoS)攻击方式,它们都涉及向DNS服务器发送大量请求,最终导致目标服务器瘫痪。

DNS Amplification(DNS放大攻击)
攻击方式:攻击者利用开放的DNS解析器,将小的DNS查询请求伪装成受害者的IP地址发送到这些解析器。解析器处理请求并发送大量的响应数据到受害者的IP地址。
放大效应:通过发送较小的请求(例如几十字节),攻击者可以触发较大的响应(例如几千字节)。这样,攻击者能够利用放大效应,发送少量流量却对目标服务器造成巨大的流量冲击。

DNS Flood(DNS泛洪攻击)
攻击方式:攻击者直接向目标DNS服务器发送大量的DNS查询请求,试图通过消耗服务器的资源使其无法正常响应合法请求。
请求数量:DNS Flood攻击依赖于发送大量的请求,而这些请求通常不涉及放大效应。攻击者需要拥有较大的带宽资源以产生足够多的请求来压垮目标服务器。

选项

-i 直接写入
-e 拼接指令
-n 只打印经过编辑的行
-u 禁用输出缓冲,即实时输出结果

替换标记

/g global全局替换
/p print将经过替换的行打印输出
## 需要注意的是,如果只使用 /p 标记而不使用 -n 选项,sed 命令将会打印所有经过编辑的行,包括未匹配到的行。
## 而只使用 -n 选项而不使用 /p 标记,则不会打印任何行。因此,两者结合使用时可以过滤并打印出符合条件的行。
/i 忽略大小写替换标记

地址范围选项

n:行号选项,表示只对指定行号的行进行操作。例如,5s/pattern/replacement/ 表示只对第 5 行进行替换操作。
start:起始行选项,表示从指定行开始应用编辑命令。例如,/pattern/s/replacement/ 表示从匹配到 pattern 的行开始进行替换操作。
start,end:起始行和结束行选项,表示在指定的行范围内应用编辑命令。例如,/start/,/end/s/pattern/replacement/ 表示在匹配到 start 行和 end 行之间进行替换操作。
$:最后一行选项,表示对最后一行进行操作。例如,$s/pattern/replacement/ 表示对最后一行进行替换操作。
!:否定行选项,表示对选定行之外的行应用编辑命令。例如,1,3!s/pattern/replacement/ 表示对除了第 1 行到第 3 行之外的所有行进行替换操作。

ssh免密登录

例子:机器A免密登录机器B

# 在A上执行
## 生成密钥对,保存在~/.ssh中,一般有两个文件id_rsa和id_rsa.pub对应私钥和公钥;
## 如果要实现免密登录,在输入passphrase时直接回车,不要输入内容
ssh-keygen -t rsa
scp ~/.ssh/id_rsa.pub username@B_ipAddress:/path/to/temporary_location

# 在B上执行
## 若有多台机器希望免密登录B,在B上的authorized_keys后面追加写入公钥即可
cat /path/to/temporary_location >> ~/.ssh/authorized_keys

passphrase作用是解密私钥


PAM(Pluggable Authentication Modules)可插拔身份认证模块

在/etc/pam.d/文件夹中,每个文件对应一个应用程序或服务。这些文件的命名通常与相应的应用程序或服务的名称相对应。例如sshd文件对应 SSH 服务的身份验证和授权规则,login文件对应本地登录过程的身份验证和授权规则。
提权之后,一种持久化方法是修改PAM。

# 在/etc/pam.d/下文件内容主要依据四个规则:

auth:身份验证规则
    auth required pam_unix.so:使用标准的UNIX身份验证方法进行验证。
    auth required pam_google_authenticator.so nullok:使用Google Authenticator进行两步验证,允许用户在没有启用Google Authenticator的情况下进行身份验证。

account:授权规则
    account required pam_unix.so:使用标准的UNIX账户管理来控制用户的访问权限。
    account required pam_access.so:使用/etc/security/access.conf文件中的规则来控制用户的访问控制。

password:密码管理规则
    password required pam_cracklib.so:使用CrackLib库来检查和强制密码策略。
    password required pam_unix.so sha512 shadow:使用UNIX密码管理和shadow密码文件来存储用户密码。

session:会话管理规则
    session required pam_limits.so:设置用户会话的资源限制,如最大打开文件数和最大进程数。
    session optional pam_systemd.so:与systemd集成,以管理用户会话的生命周期。

举个例子:

# 编辑 /etc/pam.d/login
# 添加或修改以下行
auth required pam_tally2.so deny=5 unlock_time=600
auth required pam_unix.so
account required pam_tally2.so
account required pam_unix.so

此例中,
认证阶段(auth):
pam_tally2.so会首先执行,它会检查登录尝试次数是否超过限制。如果登录尝试次数超过设置的限制(如 deny=5),它将导致认证失败,并且用户账户会被锁定指定时间(如 unlock_time=600)。
即使 pam_tally2.so 失败,pam_unix.so 还是会继续执行。这意味着系统会继续检查用户的用户名和密码是否正确。如果用户名和密码正确,但 pam_tally2.so 失败,整体认证仍然会失败。

账户管理阶段(account):
pam_tally2.so会再次执行,用于更新和检查账户状态,例如解锁被锁定的账户。
然后pam_unix.so会执行,进行标准的账户管理操作,例如检查账户是否已过期。

总结
在PAM配置文件中,每个required模块必须成功,否则整个认证过程将失败。然而,它们会按照配置文件中的顺序依次执行,即使前面的模块失败了,后面的模块也会继续执行,但最终认证结果将取决于所有required模块的结果。


那么是否可以重写pam_unix.so?可以。
只要模块路径正确且模块本身编写和安装正确,PAM 配置文件就能够识别并调用它。
如何编写正确的PAM模块可以参考Linux-PAM GNU
攻击样例可以参考Linux 攻擊場域:SSH 登入攻擊手法初探,文中利用

account sufficient bad_pam.so

指定该模块(bad_pam.so)返回成功(Success)状态,那么就无需再继续执行后面的账户授权规则,即可立即授权通过。而在bad_pam.so中可以操作很多事,比如任意密码登录,登录不被记录,非指定密码(后门账号)登录之后键盘被记录等等。

检测方法

观察/usr/lib/x86_64-linux-gnu/security/和/etc/pam.d/中文件的修改时间hash值是否可疑。