Skip to content

Commit

Permalink
add require SAN to certificate authentication docs (pingcap#3429)
Browse files Browse the repository at this point in the history
  • Loading branch information
lysu authored Jun 1, 2020
1 parent 721138e commit 757eb65
Showing 1 changed file with 35 additions and 6 deletions.
41 changes: 35 additions & 6 deletions certificate-authentication.md
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key

### 获取用户证书信息

用户证书信息可由 `require subject``require issuer``require cipher` 来指定,用于检查 X.509 certificate attributes。
用户证书信息可由 `require subject``require issuer``require san``require cipher` 来指定,用于检查 X.509 certificate attributes。

+ `require subject`:指定用户在连接时需要提供客户端证书的 `subject` 内容。指定该选项后,不需要再配置 `require ssl` 或 x509。配置内容对应[生成客户端密钥和证书](#生成客户端密钥和证书) 中的录入信息。

Expand All @@ -275,11 +275,39 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key
可以执行以下命令来获取该项的信息:
{{< copyable "shell-regular" >}}
```
openssl x509 -noout -subject -in ca-cert.pem | sed 's/.\{8\}//' | sed 's/, /\//g' | sed 's/ = /=/g' | sed 's/^/\//'
```
+ `require cipher`:配置该项检查客户端支持的 cipher method。可以使用以下语句来查看支持的列表:
+ `require san`:指定签发用户证书的 CA 证书的 `Subject Alternative Name` 内容。配置内容对应生成客户端证书使用的 [openssl.cnf 配置文件的 `alt_names` 信息](/generate-self-signed-certificates.md)。
+ 可以执行以下命令来获取已生成证书中的 `require san` 项的信息:
{{< copyable "shell-regular" >}}
```shell
openssl x509 -noout -ext subjectAltName -in client.crt
```
+ `require san` 目前支持以下 `Subject Alternative Name` 检查项:
- URI
- IP
- DNS
+ 多个检查项可通过逗号连接后进行配置。例如,对用户 `u1` 进行以下配置:
{{< copyable "sql" >}}
```sql
create user 'u1'@'%' require san 'DNS:d1,URI:spiffe://example.org/myservice1,URI:spiffe://example.org/myservice2'
```
以上配置只允许用户 `u1` 使用 URI 项为 `spiffe://example.org/myservice1` 或 `spiffe://example.org/myservice2`、DNS 项为 `d1` 的证书登录 TiDB。
+ `require cipher`:配置该项检查客户端支持的 `cipher method`。可以使用以下语句来查看支持的列表:
{{< copyable "sql" >}}
Expand All @@ -289,37 +317,38 @@ mysql -utest -h0.0.0.0 -P4000 --ssl-cert /path/to/client-cert.new.pem --ssl-key
### 配置用户证书信息
获取用户证书信息(`require subject`, `require issuer` 和 `require cipher`)后,可在创建用户、赋予权限或更改用户时配置用户证书信息。将以下命令中的 `<replaceable>` 替换为对应的信息。可以选择配置其中一项或多项,使用空格或 `and` 分隔。
获取用户证书信息(`require subject`, `require issuer`、`require san` 和 `require cipher`)后,可在创建用户、赋予权限或更改用户时配置用户证书信息。将以下命令中的 `<replaceable>` 替换为对应的信息。可以选择配置其中一项或多项,使用空格或 `and` 分隔。
+ 可以在创建用户 (`create user`) 时配置登陆时需要校验的证书信息:
{{< copyable "sql" >}}
```sql
create user 'u1'@'%' require issuer '<replaceable>' subject '<replaceable>' cipher '<replaceable>';
create user 'u1'@'%' require issuer '<replaceable>' subject '<replaceable>' san '<replaceable>' cipher '<replaceable>';
```
+ 可以在赋予权限 (`grant`) 时配置登陆时需要校验的证书信息:
{{< copyable "sql" >}}
```sql
grant all on *.* to 'u1'@'%' require issuer '<replaceable>' subject '<replaceable>' cipher '<replaceable>';
grant all on *.* to 'u1'@'%' require issuer '<replaceable>' subject '<replaceable>' san '<replaceable>' cipher '<replaceable>';
```
+ 还可以在修改已有用户 (alter user) 时配置登陆时需要校验的证书信息:
{{< copyable "sql" >}}
```sql
alter user 'u1'@'%' require issuer '<replaceable>' subject '<replaceable>' cipher '<replaceable>';
alter user 'u1'@'%' require issuer '<replaceable>' subject '<replaceable>' san '<replaceable>' cipher '<replaceable>';
```
配置完成后,用户在登录时 TiDB 会验证以下内容:
+ 使用 SSL 登录,且证书为服务器配置的 CA 证书所签发
+ 证书的 `Issuer` 信息和权限配置里的信息相匹配
+ 证书的 `Subject` 信息和权限配置里的信息相匹配
+ 证书的 `Subject Alternative Name` 信息和权限配置里的信息相匹配
全部验证通过后用户才能登录,否则会报 `ERROR 1045 (28000): Access denied` 错误。登录后,可以通过以下命令来查看当前链接是否使用证书登录、TLS 版本和 Cipher 算法。
Expand Down

0 comments on commit 757eb65

Please sign in to comment.