金仓数据库KingbaseES安全指南--6.4. RADIUS身份验证

6.4.1. 关于RADIUS身份验证

这种认证方法的操作类似于password,不过它使用 RADIUS 作为密码验证方式。RADIUS 只被用于验证用户名/密码。因此,在 RADIUS 能被用于认证之前,用户必须已经存在于数据库中。其中,Freeradius是RADIUS(Remote Authentication Dial-In User Service)协议服务器的开源版本,可用来提供RADIUS协议的AAA(认证、授权、记账)服务。

6.4.2. RADIUS身份验证原理

RADIUS服务器和KingbaseES服务器通过网络连接。当数据库应用(ksql、jdbc等)访问数据库执行登录操作时,KingbaseES根据应用提供的登录信息向FreeRADIUS服务器发起认证请求。RADIUS依据提供的登录信息产生认证响应,KingbaseES根据认证响应决定是否允许登录到数据库。

当使用 RADIUS 认证时,一个访问请求消息将被发送到配置好的 RADIUS 服务器。这一请求将是Authenticate Only类型,并且包含参数user namepassword(加密的)和NAS Identifier。该请求将使用一个与服务器共享的密钥加密。RADIUS 服务器将对这个服务器响应Access Accept或者Access Reject。不支持RADIUS accounting。

可以指定多个RADIUS服务器,这种情况下将会依次验证。如果从一台服务器接收到否定响应,则认证失败。如果没有接收到响应,则将会尝试列表中的下一台服务器。要指定多台服务器,可将服务器名放在引号内并且用逗号分隔开。如果指定了多台服务器,所有其他RADIUS选项也可以以逗号分隔的列表给出,用来为每台服务器应用个别的值。也可以把选项指定为一个单一值,这样该值将被应用到所有的服务器。

6.4.3. 配置RADIUS身份验证

6.4.3.1. 安装

  1. KingbaseES数据库安装

无特殊要求,常用方式安装即可。安装完后initdb初始化数据目录。

  1. FreeRADIUS安装

本文示例使用FreeRADIUS配置RADIUS身份验证,安装步骤如下:

  1. 下载freeradius-server-release_3_0_21.tar.gz源代码包。

  2. 解压源代码包:tar xvf freeradius-server-release_3_0_21.tar.gz

  3. 进入源代码目录执行:

$ ./configure
$ make
$ make install

FreeRADIUS 编译依赖额外的软件包,如系统缺失configure过程会报错,安装缺失软件包即可。如无指定安装后默认配置文件路径为:/usr/local/etc/raddb 服务器程序名为radiusd。

6.4.3.2. 配置

  1. 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”

  1. FreeRADIUS服务配置

  1. 认证数据

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认证,还要数据库内已有这个用户才能登录到数据库。

  1. 客户端配置

使用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. 启动服务

  1. 启动KingbaseES

  2. 启动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

6.4.4. 通过RADIUS身份验证连接Kingbase

RADIUS对数据库应用是透明的,正常方式连接数据库即可。

  1. ksql客户端请使用符合sys_hba.conf中的radius认证方式的参数(ip、database、user)登录。例如:

ksql -U radius -d radius -W radiuspass  -h 127.0.0.1
  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认证则不会有输出。

你可能感兴趣的:(KingbaseES产品手册,数据库,安全,服务器)