接入 SSL 认证配置:满足等保最佳实践
前言
随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安全传输。本文将详细介绍在等保要求下,如何为OpenGauss配置SSL客户端接入认证。
一、配置客户端接入认证
背景信息
如果主机需要远程连接数据库,必须在数据库系统的配置文件中增加此主机的信息,并且进行客户端接入认证。配置文件(默认名称为pg_hba.conf)存放在数据库的数据目录里。hba(host-based authentication)表示是基于主机的认证。
本产品支持如下三种认证方式,这三种方式都需要配置“pg_hba.conf”文件。
基于主机的认证:服务器端根据客户端的IP地址、用户名及要访问的数据库来查看配置文件从而判断用户是否通过认证。
口令认证:包括远程连接的加密口令认证和本地连接的非加密口令认证。
SSL加密:使用OpenSSL(开源安全通信库)提供服务器端和客户端安全连接的环境。
“pg_hba.conf”文件的格式是一行写一条信息,表示一个认证规则,空白和注释(以#开头)被忽略。
[omm@worker1 dn1]$ ls
base gswlm_userinfo.cfg pg_errorinfo pg_llog pg_replslot pg_twophase postgresql.conf.lock server.key
cacert.pem mot.conf pg_hba.conf pg_location pg_serial PG_VERSION postmaster.opts server.key.cipher
gaussdb.state pg_clog pg_hba.conf.bak pg_logical pg_snapshots pg_xlog postmaster.pid server.key.rand
global pg_csnlog pg_hba.conf.lock pg_multixact pg_stat_tmp postgresql.conf postmaster.pid.lock undo
gs_gazelle.conf pg_ctl.lock pg_ident.conf pg_notify pg_tblspc postgresql.conf.guc.bak server.crt
[omm@worker1 dn1]$ vim pg_hba.conf
每个认证规则是由若干空格和/,空格和制表符分隔的字段组成。如果字段用引号包围,则它可以包含空白。一条记录不能跨行存在。
1. 以操作系统用户omm登录数据库主节点。
2. 配置客户端认证方式
允许客户端以“jack”用户连接到本机,此处远程连接禁止使用“omm”用户(即数据库初始化用户)。
例如,下面示例中配置允许IP地址为192.0.2.121的客户端访问本机。
gs_guc set -N all -I all -h “host all jack 192.0.2.121/32 sha256”
[omm@worker1 dn1]$ gs_guc set -N all -I all -h "host all jack 192.0.2.121/32 sha256"
The gs_guc run with the following arguments: [gs_guc -N all -I all -h host all jack 192.0.2.121/32 sha256 set ].
Begin to perform the total nodes: 1.
Popen count is 1, Popen success count is 1, Popen failure count is 0.
Begin to perform gs_guc for datanodes.
Command count is 1, Command success count is 1, Command failure count is 0.
Total instances: 1. Failed instances: 0.
ALL: Success to perform gs_guc!
[omm@worker1 dn1]$
3. 创建“jack”用户
使用“jack”用户前,需先本地连接数据库,并在数据库中使用如下语句建立“jack”用户:
CREATE USER jack PASSWORD ‘Test@123’;
[root@worker1 mnt]# su - omm
Last login: Mon Jun 10 10:04:09 CST 2024 on pts/1
[omm@worker1 ~]$ gsql -d postgres -p 15000
gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
openGauss=# CREATE USER jack PASSWORD 'Test@123';
CREATE ROLE
openGauss=#
-N all表示openGauss的所有主机。
-I all表示主机的所有实例。
-h表示指定需要在“pg_hba.conf”增加的语句。
all表示允许客户端连接到任意的数据库。
jack表示连接数据库的用户。
192.0.2.121/32表示只允许IP地址为192.0.2.121的主机连接。此处的IP地址不能为openGauss内的IP,在使用过程中,请根据用户的网络进行配置修改。32表示子网掩码为1的位数,即255.255.255.255。
sha256表示连接时jack用户的密码使用sha256算法加密。
这条命令在数据库主节点实例对应的“pg_hba.conf”文件中添加了一条规则,用于对连接数据库主节点的客户端进行鉴定。
“pg_hba.conf”文件中的每条记录可以是下面四种格式之一,四种格式的参数说明请参见配置文件参考。
[omm@worker1 dn1]$ vim pg_hba.conf
local DATABASE USER METHOD [OPTIONS]
host DATABASE USER ADDRESS METHOD [OPTIONS]
hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]
因为认证时系统是为每个连接请求顺序检查“pg_hba.conf”里的记录的,所以这些记录的顺序是非常关键的。
说明:
在配置“pg_hba.conf”文件时,请依据通讯需求按照格式内容从上至下配置记录,优先级高的需求需要配置在前面。openGauss和扩容配置的IP优先级最高,用户手动配置的IP请放在这二者之后,如果已经进行的客户配置和扩容节点的IP在同一网段,请在扩容前删除,扩容成功后再进行配置。
因此对于认证规则的配置建议如下: 靠前的记录有比较严格的连接参数和比较弱的认证方法。靠后的记录有比较宽松的连接参数和比较强的认证方法。
说明:
一个用户要想成功连接到特定的数据库,不仅需要通过pg_hba.conf中的规则检查,还必须要有该数据库上的CONNECT权限。如果希望控制某些用户只能连接到指定数据库,赋予/撤销CONNECT权限通常比在pg_hba.conf中设置规则更为简单。
4. 配置客户端认证示例
对应openGauss外部客户端连接,trust为不安全的认证方式,请将认证方式设置为sha256。
[omm@worker1 dn1]$ vim pg_hba.conf
示例
TYPE DATABASE USER ADDRESS METHOD
“local” is for Unix domain socket connections only
#表示只允许以安装时-U参数指定的用户从服务器本机进行连接。
local all all trust
IPv4 local connections:
#表示允许jack用户从192.0.2.121主机上连接到任意数据库,使用sha256算法对密码进行加密。
host all jack 192.0.2.121/32 sha256
#表示允许任何用户从192.0.2.121/24网段的主机上连接到任意数据库,使用sha256算法对密码进行加密,并且经过SSL加密传输。
hostssl all all 192.0.2.121/24 sha256
#表示禁止任何用户从192.0.2.121/32网段的主机上连接到任意数据库。
host all all 192.0.2.121/32 reject
二、SSL证书管理
openGauss默认配置了通过openssl生成的安全证书、私钥。
1、证书生成
在测试环境下,用户可以用通过以下方式进行数字证书测试。在客户的运行环境中,请使用从CA认证中心申请的数字证书。
2、自认证证书生成过程
2.1 搭建CA环境。
–假设用户为omm已存在,搭建CA的路径为test
–以root用户身份登录Linux环境,切换到用户omm
[root@worker1 ~]# su - omm
Last login: Tue Jun 4 22:05:29 CST 2024 on pts/0
[omm@worker1 ~]$ ls
gaussdb_tmp
[omm@worker1 ~]$ mkdir test
[omm@worker1 ~]$ cd /etc/pki/tls/
[omm@worker1 tls]$ ls
cert.pem certs misc openssl.cnf private
[omm@worker1 tls]$
–copy 配置文件openssl.cnf到test下
[omm@worker1 tls]$ ls
cert.pem certs misc openssl.cnf private
[omm@worker1 tls]$ cp openssl.cnf ~/test
[omm@worker1 tls]$ cd ~/test
[omm@worker1 test]$ ls
openssl.cnf
[omm@worker1 test]$
–到test文件夹下,开始搭建CA环境
–创建文件夹demoCA./demoCA/newcerts./demoCA/private
[omm@worker1 test]$ mkdir ./demoCA ./demoCA/newcerts ./demoCA/private
[omm@worker1 test]$ chmod 700 ./demoCA/private
[omm@worker1 test]$
–创建serial文件,写入01
[omm@worker1 test]$ echo '01'>./demoCA/serial
–创建文件index.txt
[omm@worker1 test]$ touch ./demoCA/index.txt
[omm@worker1 test]$
–修改openssl.cnf配置文件中的参数
[omm@worker1 test]$ ls
demoCA openssl.cnf
[omm@worker1 test]$ vim openssl.cnf
dir = ./demoCA
default_md = sha256
–至此CA环境搭建完成
2.2 生成根私钥。
–生成CA私钥
[omm@worker1 test]$
[omm@worker1 test]$ openssl genrsa -aes256 -out demoCA/private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................+++++
..................+++++
e is 65537 (0x010001)
Enter pass phrase for demoCA/private/cakey.pem:
–设置根私钥的保护密码,假设为Test@123
Enter pass phrase for demoCA/private/cakey.pem:
–再次输入私钥密码 Test@123
Verifying - Enter pass phrase for demoCA/private/cakey.pem:
2.3 生成根证书请求文件。
–生成CA根证书申请文件careq.pem
[omm@worker1 test]$
[omm@worker1 test]$ openssl req -config openssl.cnf -new -key demoCA/private/cakey.pem -out demoCA/careq.pem
Enter pass phrase for demoCA/private/cakey.pem:
–输入根私钥密码 Test@123
[omm@worker1 test]$
[omm@worker1 test]$ openssl req -config openssl.cnf -new -key demoCA/private/cakey.pem -out demoCA/careq.pem
Enter pass phrase for demoCA/private/cakey.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
–以下名称请牢记,生成服务端证书和客户端证书时填写的信息需要与此处的一致
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xian
Organization Name (eg, company) [Default Company Ltd]:Abc
Organizational Unit Name (eg, section) []:hello
Common Name (eg, your name or your server's hostname) []:open
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[omm@worker1 test]$
2.4 生成自签发根证书。
–生成根证书时,需要修改openssl.cnf文件,设置basicConstraints=CA:TRUE
[omm@worker1 test]$ vim openssl.cnf
–生成CA自签发根证书
[omm@worker1 test]$
[omm@worker1 test]$ openssl ca -config openssl.cnf -out demoCA/cacert.pem -keyfile demoCA/private/cakey.pem -selfsign -infiles demoCA/careq.pem
Using configuration from openssl.cnf
Enter pass phrase for demoCA/private/cakey.pem:
–输入根私钥密码 Test@123
[omm@worker1 test]$ openssl ca -config openssl.cnf -out demoCA/cacert.pem -keyfile demoCA/private/cakey.pem -selfsign -infiles demoCA/careq.pem
Using configuration from openssl.cnf
Enter pass phrase for demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jun 9 06:58:22 2024 GMT
Not After : Jun 9 06:58:22 2025 GMT
Subject:
countryName = CN
stateOrProvinceName = shanxi
organizationName = Abc
organizationalUnitName = hello
commonName = world
X509v3 extensions:
X509v3 Basic Constraints:
CA:TRUE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
2C:49:CE:02:2F:37:8F:AE:3E:5F:83:A9:38:1A:12:16:1B:E1:FB:C0
X509v3 Authority Key Identifier:
keyid:2C:49:CE:02:2F:37:8F:AE:3E:5F:83:A9:38:1A:12:16:1B:E1:FB:C0
Certificate is to be certified until Jun 9 06:58:22 2025 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[omm@worker1 test]$
–至此CA根证书自签发完成,根证书demoCA/cacert.pem。
2.5 生成服务端证书私钥。
–生成服务端私钥文件server.key
[omm@worker1 test]$ openssl genrsa -aes256 -out server.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................+++++
...................................................................................................+++++
e is 65537 (0x010001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
[omm@worker1 test]$
–服务端私钥的保护密码,假设为Test@123
Verifying - Enter pass phrase for server.key:
–再次确认服务端私钥的保护密码,即为Test@123
2.6 生成服务端证书请求文件。
–生成服务端证书请求文件server.req
[omm@worker1 test]$ openssl req -config openssl.cnf -new -key server.key -out server.req
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
–以下填写的信息与创建CA时的信息一致
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xian
Organization Name (eg, company) [Default Company Ltd]:Abc
Organizational Unit Name (eg, section) []:hello
Common Name (eg, your name or your server's hostname) []:world
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[omm@worker1 test]$
2.7 生成服务端证书。
–生成服务端/客户端证书时,修改openssl.cnf文件,设置basicConstraints=CA:FALSE
[omm@worker1 test]$ vim openssl.cnf
–修改demoCA/index.txt.attr中属性为no。
[omm@worker1 test]$ vim demoCA/index.txt.attr
–对生成的服务端证书请求文件进行签发,签发后将生成正式的服务端证书server.crt
[omm@worker1 test]$ openssl ca -config openssl.cnf -in server.req -out server.crt -days 3650 -md sha256
Using configuration from openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 2 (0x2)
Validity
Not Before: Jun 9 07:07:00 2024 GMT
Not After : Jun 7 07:07:00 2034 GMT
Subject:
countryName = CN
stateOrProvinceName = shanxi
organizationName = Abc
organizationalUnitName = hello
commonName = world
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
2B:E3:44:16:67:1B:D1:27:C8:8D:9C:F1:02:72:3C:59:D8:26:B0:47
X509v3 Authority Key Identifier:
keyid:2C:49:CE:02:2F:37:8F:AE:3E:5F:83:A9:38:1A:12:16:1B:E1:FB:C0
Certificate is to be certified until Jun 7 07:07:00 2034 GMT (3650 days)
Sign the certificate? [y/n]:
–选择y对证书进行签发
Sign the certificate? [y/n]:y
–选择y,证书签发结束
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
去掉私钥密码保护,方法如下:
–去掉服务端私钥的密码保护
[omm@worker1 test]$ openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:
writing RSA key
[omm@worker1 test]$
–如果不去掉服务端私钥的密码保护需要使用gs_guc工具对存储密码进行加密保护
[omm@worker1 test]$ gs_guc encrypt -M server -D ./
The gs_guc run with the following arguments: [gs_guc -M server -D ./ encrypt ].
Password:
gs_guc encrypt -M server
[omm@worker1 test]$
–根据提示输入服务端私钥的密码,加密后会生成server.key.cipher,server.key.rand两个私钥密码保护文件
2.8 客户端证书,私钥的生成。
生成客户端证书和客户端私钥的方法和要求与服务端相同。
–生成客户端私钥
[omm@worker1 test]$ openssl genrsa -aes256 -out client.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
........+++++
...................................................+++++
e is 65537 (0x010001)
Enter pass phrase for client.key:
Verifying - Enter pass phrase for client.key:
[omm@worker1 test]$
–生成客户端证书请求文件
[omm@worker1 test]$ openssl req -config openssl.cnf -new -key client.key -out client.req
Enter pass phrase for client.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:xian
Organization Name (eg, company) [Default Company Ltd]:Abc
Organizational Unit Name (eg, section) []:hello
Common Name (eg, your name or your server's hostname) []:world
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[omm@worker1 test]$
–对生成的客户端证书请求文件进行签发,签发后将生成正式的客户端证书client.crt
[omm@worker1 test]$ openssl ca -config openssl.cnf -in client.req -out client.crt -days 3650 -md sha256
Using configuration from openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 3 (0x3)
Validity
Not Before: Jun 9 07:15:47 2024 GMT
Not After : Jun 7 07:15:47 2034 GMT
Subject:
countryName = CN
stateOrProvinceName = shanxi
organizationName = Abc
organizationalUnitName = hello
commonName = world
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
1C:2C:1A:11:FE:56:55:E5:71:78:60:AF:C3:89:B5:7C:E2:C8:DF:F6
X509v3 Authority Key Identifier:
keyid:2C:49:CE:02:2F:37:8F:AE:3E:5F:83:A9:38:1A:12:16:1B:E1:FB:C0
Certificate is to be certified until Jun 7 07:15:47 2034 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[omm@worker1 test]$
去掉私钥密码保护,方法如下:
–去掉客户端私钥的密码保护
[omm@worker1 test]$ openssl rsa -in client.key -out client.key
Enter pass phrase for client.key:
writing RSA key
[omm@worker1 test]$
–如果不去掉客户端私钥的密码保护需要使用gs_guc工具对存储密码进行加密保护
[omm@worker1 test]$ gs_guc encrypt -M client -D ./
The gs_guc run with the following arguments: [gs_guc -M client -D ./ encrypt ].
Password:
gs_guc encrypt -M client
[omm@worker1 test]$
–根据提示输入客户端私钥的密码,加密后会生成client.key.cipher,client.key.rand两个私钥密码保护文件。
将客户端密钥转化为DER格式,方法如下:
[omm@worker1 test]$ openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt
[omm@worker1 test]$ ls
client.crt client.key.cipher client.key.rand demoCA server.crt server.key.cipher server.req
client.key client.key.pk8 client.req openssl.cnf server.key server.key.rand
[omm@worker1 test]$
三、用SSL进行安全的TCP/IP连接
openGauss支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。
前提条件:
从CA认证中心申请到正式的服务器、客户端的证书和密钥。(假设服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。)
当用户远程连接到数据库主节点时,需要使用sha256的认证方式。
当内部服务器之间连接时,需要使用trust的认证方式,支持IP白名单认证。
openGauss在数据库部署完成后,默认已开启SSL认证模式。服务器端证书,私钥以及根证书已经默认配置完成。用户需要配置客户端的相关参数。
1、配置客户端参数。
已从CA认证中心申请到客户端默认证书,私钥,根证书以及私钥密码加密文件。假设证书、私钥和根证书都放在“/home/omm”目录。
[omm@worker1 test]$ ls
client.crt client.key.cipher client.key.rand demoCA server.crt server.key.cipher server.req
client.key client.key.pk8 client.req openssl.cnf server.key server.key.rand
[omm@worker1 test]$ pwd
/home/omm/test
[omm@worker1 test]$
1.1 双向认证需配置如下参数:
[omm@worker1 test]$
[omm@worker1 test]$ export PGSSLCERT="/home/omm/test/client.crt"
[omm@worker1 test]$ export PGSSLKEY="/home/omm/test/client.key"
[omm@worker1 test]$ export PGSSLMODE="verify-ca"
[omm@worker1 test]$ export PGSSLROOTCERT="/home/omm/test/cacert.pem"
[omm@worker1 test]$
1.2 单向认证需要配置如下参数:
export PGSSLMODE=“verify-ca”
export PGSSLROOTCERT="/home/omm/cacert.pem"
2、修改客户端密钥的权限。
客户端根证书,密钥,证书以及密钥密码加密文件的权限,需保证权限为600。如果权限不满足要求,则客户端无法以SSL连接到openGauss。
[omm@worker1 test]$ chmod 600 client.key
[omm@worker1 test]$ chmod 600 client.crt
[omm@worker1 test]$ chmod 600 client.key.cipher
[omm@worker1 test]$ chmod 600 client.key.rand
[omm@worker1 test]$ chmod 600 cacert.pem
[omm@worker1 test]$
须知: 从安全性考虑,建议使用双向认证方式。 配置客户端环境变量,必须包含文件的绝对路径。
3、验证SSL配置
使用支持SSL的数据库客户端工具(如gsql、psql等)连接到OpenGauss服务器,并检查连接是否使用了SSL。可以通过客户端工具的输出或服务器的日志文件来验证SSL连接是否成功建立。
[omm@worker1 test]$ gsql "sslmode=require host=192.0.2.121 port=15000 user=omm dbname=postgres"
gsql: FATAL: Forbid remote connection with initial user.
[omm@worker1 test]$ gsql "sslmode=require host=192.0.2.121 port=15000 user=jack dbname=postgres"
Password:
gsql ((openGauss 6.0.0-RC1 build ed7f8e37) compiled at 2024-03-31 11:59:31 commit 0 last mr )
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.
openGauss=>
显示SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
说明使用了SSL
结语:
本文介绍了在等保要求下为openGauss配置SSL客户端接入认证的过程。通过启用SSL、配置客户端接入认证规则以及验证SSL连接等步骤,可以确保OpenGauss数据库与客户端之间通信的安全性。在配置SSL时,请确保你使用的证书和私钥是有效的,并且与你的openGauss服务器和客户端兼容。同时,需要注意证书管理、权限控制、日志记录和备份恢复等方面的问题,注意保护你的SSL证书和私钥文件,以防止未经授权的访问和使用。如果你在生产环境中使用openGauss,请确保你遵循最佳的安全实践和标准来配置和管理你的SSL连接。以确保整个系统的安全性。
相关文章:
接入 SSL 认证配置:满足等保最佳实践
前言 随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安…...
PyTorch Lightning多GPU分布式日志介绍
分布式日志是指在分布式系统中,多个节点(如多台机器或多个 GPU)协同工作时,对系统运行状态、错误信息、性能指标等进行记录的过程。在 多 GPU/分布式训练 环境下,多个进程会同时运行,普通的 print() 或 logging 可能会在所有 GPU 上重复输出,导致日志混乱。PyTorch Ligh…...
LCR 160. 数据流中的中位数
文章目录 1.题目[LCR 160. 数据流中的中位数](https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/solutions/477593/zi-jie-ti-ku-jian-41-kun-nan-shu-ju-liu-zhong-de-z/)2.思路3.代码 1.题目 LCR 160. 数据流中的中位数 **中位数 **是有序整数列表中的…...
post、get、delete、put请求
一、配置axios拦截器 // src/utils/request.js import axios from axios;// 创建 axios 实例 const instance axios.create({baseURL: https://api.example.com, // 你的 API 基础 URL//timeout: 10000, // 请求超时时间 });// 请求拦截器 instance.interceptors.request.use…...
css: 针对属性left/right/top/bottom为啥设置transition动画不起作用
如题: 在css的position中 left/right/top/bottom 这类位置属性值如果考虑使用transition来添加动画,transition它会优先考虑left/top属性,而此时transition触发需要的是数值型属性,如果设置为auto则系统会默认不考虑将位置属性添加…...
计算机网络(1)基础篇
目录 1.TCP/IP 网络模型 2.键入网址--->网页显示 2.1 生成HTTP数据包 2.2 DNS服务器进行域名与IP转换 2.3 建立TCP连接 2.4 生成IP头部和MAC头部 2.5 网卡、交换机、路由器 3 Linux系统收发网络包 1.TCP/IP 网络模型 首先,为什么要有 TCP/IP 网络模型&a…...
机器学习所需要的数学知识【01】
总览 导数 行列式 偏导数 概理论 凸优化-梯度下降 kkt条件...
ArcGISPro AA表O_Name字段 内容 复制到BB表BB字段里
import arcpy# 设置工作空间和要处理的表路径 resource_shape_table r"AA表.shp" # 源表路径 resource_assets_table r"BB表.shp" # 目标表路径# 使用 SearchCursor 读取源表中的 O_Name 字段 with arcpy.da.SearchCursor(resource_shape_table, [O_Na…...
2023-arXiv-CoT Prompt 思维链提示提升大型语言模型的推理能力
arXiv | https://arxiv.org/abs/2201.11903 摘要: 我们探讨了如何生成思维链(一系列中间推理步骤)显著提高大型语言模型执行复杂推理的能力。在三个大型语言模型上的实验表明,思维链提示提高了一系列算术、常识和符号推理任务的性…...
机器学习数学基础:21.特征值与特征向量
一、引言 在现代科学与工程的众多领域中,线性代数扮演着举足轻重的角色。其中,特征值、特征向量以及相似对角化的概念和方法,不仅是线性代数理论体系的核心部分,更是解决实际问题的有力工具。无论是在物理学中描述系统的振动模式…...
逻辑分析仪的使用-以STM32C8T6控制SG90舵机为例
STM32C8T6控制SG90舵机 1.逻辑分析仪作用 逻辑分析仪在嵌入式开发中的作用非常重要,它是开发、调试和排错过程中的一个不可或缺的工具。具体来说,逻辑分析仪的作用包括以下几个方面: 1.信号捕获和分析: 逻辑分析仪能够实时捕获多个…...
QCustomplot库运用
最近需要用到这个库显示数据,需要在一个曲线图4个Y轴共用一个X轴,并且做游标,跟随鼠标移动,并且实时反馈数据到表格中。记录一下程序。 customPlot new QCustomPlot(this); customPlot->setBackground(QBrush(QColor(204,204,…...
数据中心网络监控
数据中心是全球协作的特定设备网络,用来在internet网络基础设施上传递、加速、展示、计算、存储数据信息。 对于任何利用IT基础设施的企业来说,数据中心都是运营的核心,它本质上为整个业务网络托管业务应用程序和存储空间。数据中心可以是任…...
定义+类比
定义:间接量表是备选问题或者是备选语句或者是语句中选择合适的语句表达其态度,最后选择是一个合适的语句 A给具体的表打分,是直接上数字,而不是选择合适的语句表达其态度 B给排序,也是通过数字来表达其态度,也不是选择…...
深度学习框架探秘|PyTorch:AI 开发的灵动画笔
前一篇文章我们学习了深度学习框架——TensorFlow(深度学习框架探秘|TensorFlow:AI 世界的万能钥匙)。在人工智能领域,还有一个深度学习框架——PyTorch,以其独特的魅力吸引着众多开发者和研究者。它就像一…...
NAT模式 vs DR模式:LVS 负载均衡技术的优劣与适用场景
1. NAT 模式(Network Address Translation) 工作原理 请求路径:客户端请求发送到虚拟 IP(VIP),负载均衡器(Director)通过 DNAT(目标地址转换)将请求转发到真…...
八大排序——归并排序
目录 1.基本思想 2.动态图 3.分解的时候我们可以使用递归的方式进行 代码解释 1. main 方法 2. mergeSort 方法 3. merge 方法 示例运行过程 初始数组 每轮排序后的数组 代码总结 合并两个有序序列 1.基本思想 归并排序就是递归得将原始数组递归对半分隔,…...
YOLO算法模型检测利用手机IP摄像头
1.yolo算法训练模型 yolov5训练网络数据集_yolo数据集 csdn-CSDN博客 2.模型检测 检测文件参数:yolov5的detect.py中基础参数分析-CSDN博客 3.进行IP摄像头检测 3.1下载IP摄像头 3.2打开与使用IP摄像头(确保手机与电脑在同一WiFi(局域网…...
前端职业规划
前端开发的职业规划可以根据个人兴趣、技术深度和职业目标来制定。以下是一个典型的前端开发者职业发展路径,涵盖了从初级到高级的不同阶段,以及未来的发展方向: 1. 初级阶段(0-2 年) 目标:掌握基础技能&a…...
百度舆情优化:百度下拉框中的负面如何清除?
百度的下拉词、相关搜索、大家还在搜有负面词条,一直是企业公关经理头疼的问题,小马识途营销顾问深耕网络营销领域十几年,对百度SEO优化、百度下拉框、百度相关搜索、自媒体营销、短视频营销等等技巧方面积累了一定的方法和技巧。 对于百度下…...
Java中如何高效地合并多个对象的List数据:方法与案例解析!
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…...
【Vue】打包vue3+vite项目发布到github page的完整过程
文章目录 第一步:打包第二步:github仓库设置第三步:安装插件gh-pages第四步:两个配置第五步:上传github其他问题1. 路由2.待补充 参考文章: 环境: vue3vite windows11(使用终端即可&…...
编译和链接【四】链接详解
文章目录 编译和链接【四】链接详解前言系列文章入口符号表和重定位表链接过程分段组装符号决议重定位 编译和链接【四】链接详解 前言 在我大一的时候, 我使用VC6.0对C语言程序进行编译链接和运行 , 然后我接触了VS, Qt creator等众多IDE&…...
C语言进阶——4自定义类型(2)— 位段/枚举/联合体
目录 2. 位段2.1 什么是位段2.2 位段的内存分配2.3 位段的跨平台问题2.4 位段的应用 3. 枚举3.1 枚举类型的定义3.2 枚举的优点3.3 枚举的使用 4. 联合(共用体)4.1 联合类型的定义4.2 联合的特点4.3 联合大小的计算 2. 位段 2.1 什么是位段 位段的声明…...
企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略
一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…...
250213-异常exception
1. 概念 异常的抛出(throw):若在方法运行中出现错误,则方法会生成代表该异常的一个对象,并把它交给运行时系统,这个过程叫做抛出。 异常的捕获(catch):运行时系统接收到…...
MySQL - 索引 - 介绍
索引(Index)是帮助数据库高效获取数据的数据结构. 结构 语法 创建索引 creat [unique] index 索引名 on 表名 (字段名, ...); //创建唯一索引时加上unique, 多个字段用逗号隔开 查看索引 show index from 表名; 删除索引 drop index 索引名 on 表名;...
每日一题——90. 子集 II
题目链接:90. 子集 II - 力扣(LeetCode) 代码: class Solution { private:vector<vector<int>> result;vector<int> path;void traversal(vector<int>& nums,int startindex,vector<bool> …...
Mysql进阶篇(mysqlcheck - 表维护程序)
mysqlcheck的作用 mysqlcheck客户端用于执行表维护,可以对表进行:分析、检查、优化或修复操作。 (1)分析的作用是查看表的关键字分布,能够让 sql 生成正确的执行计划(支持 InnoDB,MyISAM&#x…...
ChartDB:一个基于Web的可视化数据库设计工具
这次给大家介绍一个可视化的数据库设计工具:ChartDB。 ChartDB 是一个免费开源的数据库可视化设计工具,支持的数据库包括 MySQL、MariaDB、PostgreSQL、Microsoft SQL Server、SQLite、ClickHouse 等。 对于已有的数据库,ChartDB 提供了一键…...
Java NIO基础与实战:如何提升IO操作性能
Java NIO 概述 Java NIO(新 I/O)是 Java 提供的一个更为高效的 I/O 处理框架。Java NIO(New I/O)是对传统 I/O(java.io)模型的改进,它引入了非阻塞 I/O 操作和面向缓冲区的数据读写方式&#x…...
Elasticsearch:同义词在 RAG 中重要吗?
作者:来自 Elastic Jeffrey Rengifo 及 Toms Mura 探索 RAG 应用程序中 Elasticsearch 同义词的功能。 同义词允许我们使用具有相同含义的不同词语在文档中搜索,以确保用户无论使用什么确切的词语都能找到他们所寻找的内容。你可能会认为,由于…...
Python - Python正则表达式
正则表达式(Regular Expression),又称规则表达式。正则表达式(Regular Expression)是一组由字母和符号组成的特殊文本,用于从文本中找出满足特定格式的句子。正则表达式通常被用来检索、替换那些符合某个模…...
DeepSeek 指导手册(入门到精通)
第⼀章:准备篇(三分钟上手)1.1 三分钟创建你的 AI 伙伴1.2 认识你的 AI 控制台 第二章:基础对话篇(像交朋友⼀样学交流)2.1 有效提问的五个黄金法则2.2 新手必学魔法指令 第三章:效率飞跃篇&…...
Android adb测试常用命令大全
目录 一、查看最上层成activity名字: 二、查看Activity的任务栈: 三、获取安装包信息 四、性能相关 1、显示CPU信息 : 2、查看CPU使用信息 3、内存信息(meminfo package_name or pid 使用程序的包名或者进程id显示内存信息) 4、电量信…...
【python语言应用】最新全流程Python编程、机器学习与深度学习实践技术应用(帮助你快速了解和入门 Python)
近年来,人工智能领域的飞速发展极大地改变了各个行业的面貌。当前最新的技术动态,如大型语言模型和深度学习技术的发展,展示了深度学习和机器学习技术的强大潜力,成为推动创新和提升竞争力的关键。特别是PyTorch,凭借其…...
在不知道进程的情况下怎么关闭
在不知道具体进程ID(PID)或者进程可能会变动的情况下,关闭MinIO服务器的方法通常依赖于你如何启动MinIO以及你的操作系统环境。以下是一些建议的步骤: 1. 使用系统服务管理工具 如果你将MinIO配置为系统服务(例如在L…...
算力平台 驱动云的使用
驱动云的使用 1 进入官网注册2 上传数据3 上传模型4 创建项目5 开发环境6 停止使用 1 进入官网注册 点击这个进入 可以看到注册之后送十个算力点 如果不训练,仅仅上传数据和模型,那么也是要收费的,因为存储数据要占用驱动云的空间。 2 上…...
高校LabVIEW开发调试中的常见问题
在高校进行LabVIEW开发调试时,常常面临硬件选型不当、方案设计不合理、布线不专业以及人员流动性强等问题。这些问题可能影响项目的进展和质量。本文将总结这些问题,并给出具体的解决方案,帮助学生和团队更高效地开展开发工作。 1. 硬件选…...
数据结构——结构体位域、typedef类型重定义、宏、共用体union、枚举、虚拟内存划分
一、结构体位域 1.1 结构体位域的基础 结构体位域:把结构体字节大小扣到极致的一个类型,以bit单位 格式:struct 位域体名{数据类型 位域名:位域大小;数据类型 位域名:位域大小;...};解析:位域体名:可有可无ÿ…...
git bash删除库中的分支与文件
一、 在 GitHub 上删除非 main 分支的步骤可以分为两部分:首先在本地删除该分支,然后在 GitHub 上删除远程分支。以下是详细的步骤: 1. 删除远程分支(在 GitHub 上删除) 打开 GitHub 仓库页面,进入你的仓…...
连锁收银系统的核心架构与技术选型
在连锁门店的日常运营里,连锁收银系统扮演着极为重要的角色,它不仅承担着交易结算的基础任务,还关联着库存管理、会员服务、数据分析等多个关键环节。一套设计精良的核心架构与合理的技术选型,是保障收银系统高效、稳定运行的基础…...
称呼计算器:智能科技,简化您的计算生活
一款手机应用程序,安卓设备上使用。这款计算器应用以其简洁的界面、实用的功能和良好的用户体验而受到用户的喜爱。 计算器的主要特点包括: 基本计算功能:支持加、减、乘、除等基本运算。 科学计算器模式:提供更高级的数学运算功…...
qt的QMainWindow保存窗口和恢复窗口状态
保存窗口状态 QSettings settings("MyCompany", "MyApp"); // 指定存储的应用信息 settings.setValue("mainWindowState", saveState());saveState() 返回一个 QByteArray,包含 所有停靠窗口和工具栏的状态。QSettings 用于存储数据…...
【mysql】记一次mysql服务挂了后的数据恢复过程
现象 服务器异常,导致mysql服务异常退出,重启后,校验redo log异常 说明 mysql服务是通过docker-compose启动的,serviceName是db磁盘挂载:/var/lib/mysql挂载到本地磁盘/data/mysql 处理过程 备份 查看磁盘挂载列表 docker …...
使用 LangChain 对接硅基流动(SiliconFlow)API:构建一个智能对话系统
文章目录 什么是硅基流动(SiliconFlow)?LangChain 简介在 LangChain 中对接硅基流动步骤 1:安装必要的库步骤 2:设置 API 密钥步骤 3:编写代码代码解析步骤 4:运行代码如何扩展和改进总结 在现代…...
K8s 证书认知(K8s Certificate Awareness)
K8s 证书认知 在谈起 Kubernetes 证书时,总感觉其涵盖的内容繁多,仿佛千头万绪,让人不知该从何处着手阐述。为了更好地理清思路,本文将对相关内容进行系统的梳理和记录。 1、证书及链路关系 Kubeadm部署的集群,K8s …...
iperf
iperf 是一个网络性能测试工具,用于测量TCP和UDP的网络带宽。-c 参数表示客户端模式,用于指定要连接的服务器地址。以下是一些常见的 iperf 客户端命令示例: 基本用法 iperf -c <server_ip> <server_ip>:服务器的IP…...
【FastAPI 使用FastAPI和uvicorn来同时运行HTTP和HTTPS的Python应用程序】
在本文中,我们将介绍如何使用 FastAPI和uvicorn来同时运行HTTP和HTTPS的 Python应用程序。 简介 FastAPI是一个高性能的Web框架,可以用于构建快速、可靠的API。它基于Python的类型提示和异步支持,使得开发者可以轻松地编写出安全且高效的代…...
Windows系统安装搭建悟空crm客户管理系统 教程
1、在安装悟空 CRM 之前,需要确保你的 Windows 系统上已经安装了以下软件: Web 服务器:推荐使用 Apache 或 Nginx,这里以 Nginx 为例。你可以使用集成环境套件如 XAMPP 来简化安装过程,它包含了 Nginx 、MySQL、PHP 等…...