macOS从radiusd升级到freeradius

自从macOS mojave之后Apple就移除了OS X Server中大部分的功能, 除了常用的VPN, web Server等之外, radiusd服务也被移除了.

根据官方说法, 原本用于wifi和用户验证的Radius服务将会被开源软件freeradius替代. 而且官方也给出了Service Migration Guide. 理论上按照pdf当中所说的去操作应该能转移过去, 不过里面细节并没有写太多, 所以我会把整个流程按照我所试过的方法来重述一次. 顺便把容易掉进去的坑顺便提示一下.

顺便本文的环境是从以前装有radiusd而且配置好能正常用的情况下升级到最新的macOS, 并且继续想使用macOS Server自带的Open Directory功能. 虽然macOS本身支持OpenLDAP然而似乎官方并不考虑使用此方式.

另外要注意官方提供的pdf里”和,之类的标点会被转成非英文格式, 直接复制粘贴到终端中执行的话可能会报错, 根据情况可能需要手动去修改成英文的标点符号.

准备工作

首先要做的是安装talloc, 这个用brew就能安装了. 如果装不上的话可以按照官方文档的说法手动下载源代码编译后安装.

接着是openssl, 这个理论上系统会自带有, 不过保险起见也brew安装一下, 如果提示upgradeable也可以考虑升级一下.

最后是freeredius, 这个虽然brew上有包可以安装, 但是默认安装上去之后并不会在/usr/local/lib/下生成rlm_opendirectory.a/.dylib/.la三个文件, 缺失这些文件将会在配置之后报错因而无法启动radiusd服务.

安装freeradius

解压下载好的freeradius-server源码, 并cd进该目录.

执行以下命令进行configure并指定对应路径

./configure –enable-developer=yes –localstatedir=/var –with-openssl-lib-dir=/usr/local/lib

如果没有报错的话则继续执行make进行编译:(我的mac用的是12核的CPU所以用12个核同时编译加快进度, 可根据自己电脑进行调整)

make -j12

最后没问题的话就将软件安装到电脑里:

sudo make install

一切顺利的话则应该可以可以执行以下命令看看radiusd服务是否能启动

sudo /usr/local/sbin/radiusd -X

这里执行以上命令会报错image not found, 然而如果直接执行sudo radiusd -X则能成功运行. 所以本文以下都将直接使用sudo radius来表示. 你需要根据你的环境来选择适合的方式来执行radiusd服务.

另外也有可能你的配置文件等安装的不是在/usr/local/etc/raddb/里的话, 检查下是否安装到了比如/usr/local/Cellar/freeradius-server/{verson_number}/etc/raddb等地方(特别是之前通过brew安装过link过之后又用代码手动编译安装过的), 如果是这种情况也注意之后用到类似的路径的话要改成对应你系统环境里的.

如果提示not found的话, 试着执行

echo ‘export PATH=”/usr/local/sbin:$PATH”‘ >> ~/.zshrc

这将/usr/local/sbin加入到zsh的环境里, 这样应该就能正常执行了. (当然如果你用的不是zsh的话则需要自己修改, 可以试试brew link freeradius之后brew doctor来看看是否能自动检测到问题)

配置freeradius

确认radiusd能运行之后先control-c把程序停止运行. 然后执行以下命令并确认opendirectory文件存在:

sudo ls /usr/local/etc/raddb/mods-available/ | grep opendirectory

然后执行以下命令确认.a, .dylib和.la文件存在

ls /usr/local/lib/rlm_opendirectory.*

配置sqlite

实话说我也不知道这里为啥需要sqlite,不过既然文档中说到要配置这个, 那么还是按照上面操作来吧:

cd /usr/local/etc/raddb/

sudo -s

cd mods-enabled

ln -s ../mods-available/sql sql

cd ..

执行完以上操作之后, 将会开启sql的模块, 接着打开mods-enabled/sql文件, 找到以下内容并修改:

1.找到driver =所在的位置, 修改成:

driver = “rlm_sql_sqlite”

2.找到filename所在位置, 如果被注释掉了的话则需要删除注释符号. 并且改成以下:路径

filename = “/var/db/radius/freeradius.db”

3.找到read_clients, 并取消注释:

read_clients = yes

完成以上操作之后执行

sudo mkdir /var/db/radius

以及以下命令验证修改是否有效:

sudo radiusd -XC

如果一切正常的话将显示Configuration appears to be OK.

接着执行以下命令从sql里导出nas表到client.csv暂存起来

sudo sqlite3 -csv /Library/Server/radius/raddb/sqlite_radius_client_database ‘select * from nas;’ > /tmp/clients.csv

接着执行以下命令打开数据库:

sudo sqlite3 /var/db/radius/freeradius.db

打开sqlite之后执行以下命, 令导入csv到新数据库里:

.separator “,”

.import /tmp/clients.csv nas

.q

中间可能会报错, 然而似乎并没有什么影响.

再执行一次sudo radiusd -XC确认修改没出问题.

如果各种报错sqlite找不到table的话, 可以尝试打开上面freeradius.db文件后输入以下命令创建nas, radpostauth, radcheck和radusergroup 4个表单:

CREATE TABLE nas (

 id INTEGER PRIMARY KEY,

nasname TEXT NOT NULL,

shortname TEXT NOT NULL,

type TEXT NOT NULL,

 secret TEXT NOT NULL,

  server TEXT NOT NULL

);

CREATE TABLE radpostauth (

   username TEXT NOT NULL,

   pass TEXT NOT NULL,

   reply TEXT NOT NULL,

   authdate TEXT NOT NULL

   );

CREATE TABLE radcheck (

  id INTEGER PRIMARY KEY,

      username TEXT NOT NULL,

      attribute TEXT NOT NULL,

     value TEXT NOT NULL,

    op TEXT NOT NULL

   );

CREATE TABLE radusergroup (

       username TEXT NOT NULL,

     groupname TEXT NOT NULL,

    priority INT NOT NULL

   );

配置证书

原本这里我考虑的是用openssl重新创建新的证书, 然而试了很多次发现还不如用官方给出的方法还方便.

首先备份freeradius默认创建的证书: (其实这些证书在安装的时候应该就自动生成了, 所以理论上不用macos server的证书的话直接略过这步即可)

sudo mv certs certs.orig

sudo mkdir certs

接着打开钥匙串访问app(Keychain Access.app), 找到服务器用的证书, 并导出p12文件, 导出时建议设置个简短的密码. 并将文件导出或者拷贝到/usr/local/etc/raddb/certs里

接着执行以下命令将p12文件转换成pem文件: (建议设置pem密码,可以和p12文件密码一样)

sudo openssl pkcs12 -in Certificates.p12 -out server.private.pem -nocerts

接着打开/Library/Server/radius/raddb/eap.conf文件, 找到tls部分, 记下certificates_file和CA_file路径,等会需要用到

打开/usr/local/etc/raddb/mods-enabled/eap文件,

1.找到eap部分, 找到default_eap_type, 将其改成

default_eap_type = ttls

2.找到tls-config tls-common部分, 将其改成:

private_key_password = <导出pem文件时设置的密码>

private_key_file = ${certdir}/server.private.pem

certificates_file = <eap.conf文件中certificates_file的路径,文件最后以.cert.pem结尾>

CA_file = <eap.conf文件中certificates_file的路径,文件最后以.chain.pem结尾>

这里即便不用eap.conf里的路径(比如原证书已经失效), 也可以到/etc/certificates/里找可以使用的证书, 改路径下证书都会有.cert.pem, .chain.pem和.key.pem组成. 分别对应共钥, CA和私钥证书. 也就是certificates_file, CA_file和private_key_file.

然后生成dh:(会在certs文件夹里生成dh文件, 注意当前路径)

sudo openssl dhparam -out certs/dh 2048

接着找到以下被注释的行, 并取消注释它们

random_file = /dev/urandom

fragment_size = 1024

include_length = yes

找到check_crl 并设置成:

check_crl = no

找到cache部分, 设置enable为no:

enable = no

找到ttls部分, 设置default_eap_type为mschapv2

default_eap_type = mschapv2

最后再执行一次sudo radiusd -XC确认修改没出问题. 这里会校验证书是否有效所以很有可能会报错.

设置radius users

这里的users指的是验证用户登录用的服务, 比如ldap和opendirectory. 当然我们这里只用后者.

执行以下命令激活opendirectory的组件:

cd /usr/local/etc/raddb

cd mods-enabled

sudo ln -s ../mods-available/opendirectory opendirectory

cd ..

这里不建议直接在raddb里直接进行ln -s操作, 生成的symlink可能会有问题导致最后找不到opendirectory组件进而校验失败.

接着修改sites-enabled/default文件:

在authorize部分找到filter_username, 并注释掉它

在files之后, 添加以下行, 用来启用opendirectory组件:

#Mac OS X OpenDirectory

opendirectory

紧接着下面注释掉-ldap, 这里因为只用opendirectory了所以并不需要它

在authenticate部分, 找到digest, 在其之后添加以下行:

#Mac OS X OpenDirectory

Auth-Type opendirectory {

opendirectory

}

找到accounting部分, 在里面注释掉unix

最后测试一次sudo radiusd -XC确认修改没出问题. 那么执行sudo radiusd -X的话就能直接启动radiusd服务进行wifi认证测试了.

实测刚开始会提示认证失败, 重试几次之后就能正常验证了. 估计和opendirectory的链接有关. 另外旧的OS比如macOS 10.9等系统可能会出现无法验证的问题, 这个查了下主要是旧系统不支持最新的v3的证书, 理论上可以改用v2的证书可以解决这个问题. 不过如果没有持有老旧设备或者有备用wifi(比如普通WPA认证)的话保持v3也不差.

如果验证时出现例如以下的错误的话, 那是没设置好允许的client IP, 也就是radiusd没有设置成允许除了本地127.0.0.1之外的设备联入进行验证:

Ignoring request to authentication address * port 1812 from unknown client 192.168.1.x port 65307

解决方法则是编辑/usr/local/etc/raddb里的clients.conf文件, 找到最初的ipaddr, 修改为以下启用接收来自所有IP的请求(你也可以设置成特定IP比如wifi AP的IP:

ipaddr = 0.0.0.0

创建开机自启动服务

在/Library/LaunchDaemons/下创建名为org.freeradius.radiusd.plist的文件. 并添加以下内容:

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN”
“http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>Disabled</key>
<true/>
<key>EnableTransactions</key>
<true/>
<key>Label</key>
<string>org.freeradius.radiusd</string>
<key>KeepAlive</key>
<true/>
<key>ProcessType</key>
<string>Standard</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/radiusd</string>
<string>-sf</string>
</array>
</dict>
</plist>

执行以下命令修改文件所属:

sudo chown root:wheel /Library/LaunchDaemons/org.freeradius.radiusd.plist

加载该文件到launchd并校验其是否工作正常:

sudo launchctl load -w /Library/LaunchDaemons/org.freeradius.radiusd.plist

launchctl print system/org.freeradius.radiusd.plist

以上就是macOS下安装并启用freeradius的方法了, 如果有问题欢迎在下面留言, 我会抽空尝试去解决的.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

:b1 :b2 :b3 :b4 :b5 :b6 more »

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据