安全参数
xSQL 具有对远程 SQL 连接进行密码保护的功能。
在服务器上通过在配置文件中设置 sql_authentication_required 参数来实现密码保护:
sql_authentication_required : true,
在客户端,凭证可以通过配置文件提交:
sql_login : 'user1',
sql_password : 'mypass',
或者在启动 xSQL 时在命令行中输入:
./xsql ... -user user1 -password mypass
认证
该身份验证需要一个名为“Users”的表,其中包含两个必需的字符串字段“login”和“password”,用于保存用户名和密码。例如:
create table Users (login string primary key, password string);
insert into Users values ('user1', 'mypass');
insert into Users values ('user2', 'hYfjdKK2');
远程客户端应用程序必须提供与“用户”表中所列相匹配的凭证才能连接到数据库。请注意此密码保护功能的以下重要特性:
- 用户表除了登录名和密码字段外,还可以包含其他字段。
- 数据库运行时不会对凭证进行加密。如果需要,应用程序有责任对用户表的内容进行加密或以某种方式加以保护。
- 通过远程 SQL 引擎协议传输的凭证也不会被加密。不过,可以将远程服务器身份验证与 SSL 加密结合使用。
- 如果在使用 xSQL 时启用了 SSL 加密(但未启用身份验证),则密码传输将受到保护。
如需更强大的安全性,请参阅下面的 SSL 部分。
授权
授权建立在身份验证之上,并在每次查询编译时执行。
可以通过将配置参数 sql_authorization_required 设置为 true 来启用它(请参阅 target/xsql/readme.txt)。
用户表应当再包含两个字段(角色和管理员),以便描述每个用户的角色。
Create table Users (
login string primary key,
password string,
role integer,
admin boolean
);
此外,还应创建“权限”表来描述角色对表(类)的访问权限。
create table Permissions(
class_code integer,
role integer,
access_mask integer);
access_mask 是一个遵循 Unix 风格(“读取”“执行”“写入”)权限的位掩码:
4 ReadTable
2 UpdateTable
1 AlterTable
管理员(即 admin 设置为 true 的用户)可以对表执行所有操作(不会检查权限)。
对于非管理员用户,权限是根据用户的角色来检查的。
当用户创建新表时,其角色和权限会自动调整,以便最初为该表授予其最大权限。
授权表创建示例:
create table Users(login string primary key, password string, role integer, admin boolean);
create table Permissions(class_code integer, role integer, access_mask integer);
create index Permissions_pk on Permissions(role,class_code);
insert into Users values ('root','123',1,true);
insert into Users values ('temp','111',2,false);
create table t1(x integer);
create table t2(x integer);
insert into Permissions values (4, 2, 4);
查询示例:
QueryResult result(con.executeQuery(authorizationRequired
? "select role,admin from Users where login=%v and password=%v"
: "select * from Users where login=%v and password=%v",
login, password));
C 和 C++ 示例:
SmartEDB/samples/native/sql/api/sql-01-c-api/rsql/
SmartEDB/samples/native/sql/api/sql-10-rsql/
SSL 支持
xSQL 支持服务器和客户端远程 SQL 连接、高可用性和群集连接的 SSL。当配置文件中存在 ssl_params 部分时,SSL 即被启用。以下是用于加密客户端 - 服务器交换并进行对等验证(客户端和服务器的证书都必须由存储在 ca.pem 文件中的同一 CA 证书签名)的 ssl_params 配置文件设置示例:
Server:
ssl_params : {
verify_mode: ["verify_peer", "verify_fail_if_no_cert"],
cert_file_pem: "../certs/server.crt",
pkey_file_pem: "../certs/server.key",
ca_file: "../certs/ca.pem",
}
Client:
ssl_params : {
verify_mode: ["verify_peer", "verify_fail_if_no_cert"],
cert_file_pem: "../certs/client.crt",
pkey_file_pem: "../certs/client.key",
ca_file: "../certs/ca.pem",
}
请注意,客户端和服务器参数之间的唯一区别在于证书和私钥。对于对等验证,对等方需要具有由同一 CA 签名的证书。
然而,如果只需要加密而无需认证(并且能接受其固有的安全风险),则可以使用“aNULL”系列密码。例如,对于无需对等验证的加密客户端 - 服务器交换,服务器和客户端的配置文件中的 ssl_params 部分应完全相同,如下所示:
ssl_params : {
cipher_list: "aNULL",
verify_mode: ["verify_none"],
}