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服务配置
    2. 认证数据
    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认证则不会有输出。