这种认证方法的操作类似于password
,不过它使用 RADIUS 作为密码验证方式。RADIUS 只被用于验证用户名/密码。因此,在 RADIUS 能被用于认证之前,用户必须已经存在于数据库中。其中,Freeradius是RADIUS(Remote Authentication Dial-In User Service)协议服务器的开源版本,可用来提供RADIUS协议的AAA(认证、授权、记账)服务。
RADIUS服务器和KingbaseES服务器通过网络连接。当数据库应用(ksql、jdbc等)访问数据库执行登录操作时,KingbaseES根据应用提供的登录信息向FreeRADIUS服务器发起认证请求。RADIUS依据提供的登录信息产生认证响应,KingbaseES根据认证响应决定是否允许登录到数据库。
当使用 RADIUS 认证时,一个访问请求消息将被发送到配置好的 RADIUS 服务器。这一请求将是Authenticate Only
类型,并且包含参数user name
、password
(加密的)和NAS Identifier
。该请求将使用一个与服务器共享的密钥加密。RADIUS 服务器将对这个服务器响应Access Accept
或者Access Reject
。不支持RADIUS accounting。
可以指定多个RADIUS服务器,这种情况下将会依次验证。如果从一台服务器接收到否定响应,则认证失败。如果没有接收到响应,则将会尝试列表中的下一台服务器。要指定多台服务器,可将服务器名放在引号内并且用逗号分隔开。如果指定了多台服务器,所有其他RADIUS选项也可以以逗号分隔的列表给出,用来为每台服务器应用个别的值。也可以把选项指定为一个单一值,这样该值将被应用到所有的服务器。
6.4.3.1. 安装
KingbaseES数据库安装
无特殊要求,常用方式安装即可。安装完后initdb初始化数据目录。
FreeRADIUS安装
本文示例使用FreeRADIUS配置RADIUS身份验证,安装步骤如下:
下载freeradius-server-release_3_0_21.tar.gz源代码包。
解压源代码包:tar xvf freeradius-server-release_3_0_21.tar.gz
进入源代码目录执行:
$ ./configure $ make $ make install
FreeRADIUS 编译依赖额外的软件包,如系统缺失configure过程会报错,安装缺失软件包即可。如无指定安装后默认配置文件路径为:/usr/local/etc/raddb 服务器程序名为radiusd。
6.4.3.2. 配置
KingbaseES配置
使用RADIUS认证时,对数据库对象的权限管理部分还是要依赖数据库本身的管理方式。数据库和用户以及对象的访问权限请事先在数据库内创建好。跟RADIUS相关的配置只需要编辑数据目录的sys_hba.conf 文件即可。
下列被支持的配置选项用于 RADIUS:
radiusservers
连接到 RADIUS 服务器的名称或IP地址。此参数是必需的。
radiussecrets
和 RADIUS 服务器秘密交谈时会用到共享密钥。这在 KingbaseES 和 RADIUS 服务器之间必须有完全相同的值。推荐使用至少 16 个字符的字符串。这个参数是必需的。
注意
如果KingbaseES编译为支持OpenSSL,所用的加密向量将只是强密码。在其他情况下,到 RADIUS 服务器的传输应该被视为应该被视为被混淆的、不安全的。如有必要,应采用外部安全措施。
radiusports
用于连接到 RADIUS 服务器的端口号。如果没有指定端口,则使用默认端口1812
。
radiusidentifiers
在 RADIUS 请求中字符串被用作NAS Identifier
。 这个参数可以被用作第二个参数标识。例如该用户试图以哪个数据库用户进行认证,它可以被用于 RADIUS 服务器上的策略匹配。如果没有指定标识符,默认使用kingbase
。
如果需要在RADIUS参数值中使用逗号或空格,可以通过在值周围加上要两层双引号。例如,将空格放入RADIUS机密字符串的示例如下:
host ... radius radiusservers="server1,server2" radiussecrets="""secret one"",""secret two"""
例如, 配置下列信息的hba文件
据库实例名字为:radius
用户名为:radius
radius用户对radius库有所有权限。
FreeRADIUS服务器ip地址为:127.0.0.1(本地,不在本地时请替换为远程服务器的IP地址)
FreeRADIUS服务器监听端口为:1812 (默认端口)
通讯密钥为: testing123 通讯密钥是为了保护数据库与FreeRADIUS服务器通讯而存在,是预共享密钥的方式。必须与FreeRADIUS服务器的配置是一致的,可以为不同的认证路径提供不同的密钥。
sys_hba.conf文件内容如下:
host radius all 0.0.0.0/0 radius radiusservers="127.0.0.1” radiusports="1812" radiussecrets="""testing123"""
相关sys_hba.conf文件各个参数字段意义如下表所示:
注意
为防止使用其他方式认证,hba文件中如配置有与radius认证冲突的其他项请删除。参数以逗号分割多个值的方式 。例如radiusservers="127.0.0.1,192.168.1.1”
FreeRADIUS服务配置
认证数据
radius服务器用来鉴别认证是否成功的数据。例如用户名和密码。 radius支持本地数据、LDAP、数据库等多种方式来获取鉴别数据,这是由内置的不同模块支持的。本文以本地数据为例来配置,本地数据保存在FreeRADIUS的配置文件中。 编辑配置文件目录的users文件(/usr/local/etc/raddb/users)增加用户及密码。
如下图所示:
# The canonical testing user which is in most of the # examples. # #bob Cleartext-Password := "hello" # Reply-Message := "Hello, %{User-Name}" # todd Cleartext-Password := "toddpass" Reply-Message := "Hello, %{User-Name}" radius Cleartext-Password := "radiuspass" Reply-Message := "Hello, %{User-Name}"
增加用户todd和radius,对应密码为toddpass和radiuspass 注意在这里添加的用户只是代表用该用户可以通过RADIUS认证,还要数据库内已有这个用户才能登录到数据库。
客户端配置
使用FreeRADIUS的认证服务的一方为客户端。本文中的KingbaseES数据库服务器为其客户端。 编辑客户端配置文件(/usr/local/etc/raddb/ clients.conf),当KingbaseES服务与FreeRADIUS服务在同一台机器时可直接修改原有的localhost项。也可修改或者增加一个新的客户端项。
client KingbaseES { ipaddr = 192.168.4.30 proto = * secret = testing123 require_message_authenticator = no nas_type = other # localhost isn't usually a NAS... limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } }
上图中,KingbaseES为客户端指定的别名,可任意指定。主要关注ipaddr 和 secret两个参数,其他参数可不修改。 ipaddr为KingbaseES服务器所在ip地址。 Secret为预共享密钥要与 sys_hba.conf中的配置参数一致。
注意
FreeRADIUS会对其配置文件的所属用户及读写权限检查,请不要修改这些文件的权限,否则可能导致服务启动不了。
6.4.3.3. 启动服务
启动KingbaseES
启动FreeRADIUS
直接运行命令radiusd即可启动FreeRADIUS服务器,建议以调试模式启动,这样方便查看认证请求和响应的信息。调试模式启动命令为:
#radiusd –X
启动调试模式会一直占用终端。启动成功时会输出如下信息 :
Ignoring "ldap" (see raddb/mods-available/README.rst) # Loading preacct {...} # Loading accounting {...} # Loading post-proxy {...} # Loading post-auth {...} } # server default server inner-tunnel { # from file /usr/local/etc/raddb/sites-enabled/inner-tunnel # Loading authenticate {...} # Loading authorize {...} # Loading session {...} # Loading post-proxy {...} # Loading post-auth {...} # Skipping contents of 'if' as it is always 'false' -- /usr/local/etc/raddb/sites-enabled/inner-tunnel:336 } # server inner-tunnel radiusd: #### Opening IP addresses and Ports #### listen { type = "auth" ipaddr = * port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { type = "acct" ipaddr = * port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { type = "auth" ipv6addr = :: port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { type = "acct" ipv6addr = :: port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { type = "auth" ipaddr = 127.0.0.1 port = 18120 } Listening on auth address * port 1812 bound to server default Listening on acct address * port 1813 bound to server default Listening on auth address :: port 1812 bound to server default Listening on acct address :: port 1813 bound to server default Listening on auth address 127.0.0.1 port 18120 bound to server inner-tunnel Listening on proxy address * port 43719 Listening on proxy address :: port 55298 Ready to process requests
RADIUS对数据库应用是透明的,正常方式连接数据库即可。
ksql客户端请使用符合sys_hba.conf中的radius认证方式的参数(ip、database、user)登录。例如:
ksql -U radius -d radius -W radiuspass -h 127.0.0.1
使用JDBC连接。示例代码如下:
private String url = "jdbc:postgresql://192.168.137.171:5432/todd"; private String username = "radiususer"; private String password = "radiuspass"; private Connection connection = null; public Connection getConn() { try { Class.forName("org.postgresql.Driver").newInstance(); connection = DriverManager.getConnection(url, username, password); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return connection; }
使用radius认证的登录方式,radiusd服务会有认证成功的输出信息,如果登录时没用RADIUS认证则不会有输出。