如何在Ubuntu18.04上安装和配置SimpleSAMLphp以进行SAML身份验证
介绍
SimpleSAMLphp 是一个开源 PHP 身份验证应用程序,它为作为服务提供者 (SP) 或身份提供者 (IdP) 的 SAML 2.0 提供支持。
SAML(安全断言标记语言) 是一种基于 XML 的安全通信机制,用于在组织和应用程序之间交换身份验证和授权数据。 它通常用于实现 Web SSO(单点登录)。 这消除了跨多个组织维护多个身份验证凭据的需要。 简而言之,您可以使用一个身份(例如用户名和密码)来访问多个应用程序。
SimpleSAMLphp 的一个实例连接到一个 身份验证源 ,它是一个身份提供者,如 LDAP 或用户数据库。 在授予对链接服务提供商提供的资源的访问权限之前,它会根据此身份验证源对用户进行身份验证。
在本教程中,您将安装 SimpleSamlPHP 并将其配置为使用 MySQL 数据库作为身份验证源。 您将在 MySQL 数据库中存储用户和加密密码,并测试您是否可以使用这些用户登录。
先决条件
- 按照Ubuntu 18.04初始服务器设置指南设置一台Ubuntu 18.04服务器,包括sudo非root用户和防火墙。
- 按照 How To Install Linux, Apache, MySQL, PHP (LAMP stack) on Ubuntu 18.04 在服务器上安装 Apache、MySQL 和 PHP。
- 配置为指向您的服务器的域名。 您可以按照 如何从通用域注册商 教程中指向 DigitalOcean 名称服务器来学习如何将域指向 DigitalOcean Droplets。
- 使用
ServerName
指令为域配置的虚拟主机。 按照 如何在 Ubuntu 18.04 上设置 Apache 虚拟主机为您的域名设置一个。 - 按照 如何在 Ubuntu 18.04 上使用 Let's Encrypt 指南来保护 Apache,为您配置的域设置 Let's Encrypt 证书。
第 1 步 — 下载并安装 SimpleSAMLphp
安装 SimpleSAMLphp 涉及几个步骤。 我们必须下载软件本身以及一些额外的组件和先决条件。 我们还需要对虚拟主机配置进行一些更改。
如果您尚未登录,请登录到您的服务器。
从项目的网站下载 SimpleSAMLphp。 SimpleSAMLphp 始终将其软件的最新稳定版本链接到相同的 URL。 这意味着我们可以通过键入以下内容来获取最新版本:
wget https://simplesamlphp.org/download?latest
这将下载一个名为 download?latest
的压缩文件,其中包含 SimpleSAMLphp。 使用 tar
命令提取内容:
tar zxf download?latest
文件将被解压到标有 simplesamlphp-1.x.y
的新目录中,其中 x.y
是当前版本号。 使用 ls
命令识别文件:
ls
您将看到显示的文件名:
Ouptutsimplesamlphp-1.18.5
现在,使用 cp
命令将目录的内容复制到 /var/simplesamlphp
。 请务必将版本号替换为您拥有的版本:
sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/
-a
开关确保文件权限与文件和文件夹一起复制。 源文件末尾的点确保源目录中的所有内容(包括隐藏文件)都被复制到目标目录。
注意: 如果您需要将文件安装在不同的位置,则需要更新多个文件。 具体参考SimpleSAMLphp官方安装文档。
SimpleSAMLphp 需要一些额外的软件包,包括用于处理 XML、多字节字符串、curl
和 LDAP 的 PHP 扩展。 它还需要 memcached。 使用您的包管理器安装这些。
首先,更新您的软件包列表:
sudo apt update
然后安装软件包:
sudo apt install php-xml php-mbstring php-curl php-memcache php-ldap memcached
安装完成后,重新启动 Apache 以激活新的 PHP 扩展:
sudo systemctl restart apache2
现在安装了 SimpleSAMLphp,让我们配置 Apache 以提供文件。
第 2 步 — 配置 Apache 以服务 SimpleSAMLphp
您已经配置了一个域并指向该服务器,并且您已经设置了一个虚拟主机以使用 HTTPS 通过使用 Let's Encrypt 保护 Apache。 让我们用它来服务 SimpleSAMLphp。
唯一需要对 Web 可见的 SimpleSAMLphp 目录是 /var/simplesamlphp/www
。 要将其公开给 Web,请为您的域编辑 Virtual Host SSL Apache 配置文件。
如果您的虚拟主机配置文件名为 your_domain.conf
,Let's Encrypt 创建了一个名为 your_domain-le-ssl.conf
的新配置文件,用于处理您的域的 HTTPS 请求。 使用以下命令打开 SSL 配置文件以编辑该文件。 请务必将 your_domain
替换为文件的实际名称:
sudo nano /etc/apache2/sites-available/your_domain-le-ssl.conf
该文件应如下所示,但实际文件可能有更多描述性注释:
/etc/apache2/sites-available/<^>your_domain<^>-le-ssl.conf
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName your_domain ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLCertificateFile /etc/letsencrypt/live/your_domain/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule>
此处的 ServerName
指令定义了应与此虚拟主机定义匹配的基域。 这应该是您在 Prerequisites 部分中设置 SSL 证书的域名。 让我们添加一个 Alias
指令,让 SimpleSAMLphp 控制所有匹配 https://your_domain/simplesaml/*
的 URL。 通过将以下行添加到配置文件中来做到这一点:
... [label /etc/apache2/sites-available/your_domain-le-ssl.conf] ServerAdmin webmaster@localhost DocumentRoot /var/www/html Alias /simplesaml /var/simplesamlphp/www ...
这意味着所有匹配 domain_name/simplesaml/*
的 URL 都将被定向到 /var/simplesamlphp/www
目录,从而给予 SimpleSAMLphp 控制权。
接下来,我们将通过为其指定 Require all granted
访问控制来授予对 /var/simplesamlphp/www
目录的访问权限。 这将使 SimpleSAMLphp 服务可以通过 Web 访问。 通过将以下内容添加到配置文件中来做到这一点:
/etc/apache2/sites-available/<^>your_domain<^>-le-ssl.conf
... Alias /simplesaml /var/simplesamlphp/www <Directory /var/simplesamlphp/www/> Require all granted </Directory> ...
保存并关闭文件。 重新启动 Apache 以使更改生效:
sudo systemctl restart apache2
现在 Apache 已配置为提供应用程序文件,让我们配置 SimpleSAMLphp。
第 3 步 — 配置 SimpleSAMLphp
接下来,我们需要对位于 /var/simplesamlphp/config/config.php
的核心 SimpleSAMLphp 配置进行一些更改。 在编辑器中打开文件:
nano /var/simplesamlphp/config/config.php
通过定位 'auth.adminpassword'
行并将 123
的默认值替换为更安全的密码来设置管理员密码。 此密码可让您访问 SimpleSAMLphp 安装 Web 界面中的某些页面:
/var/simplesamlphp/config/config.php
. . . 'auth.adminpassword' => 'your_admin_password', . . .
接下来,设置一个秘密盐,它应该是一个随机生成的字符串。 SimpleSAMLphp 的某些部分使用此盐来创建加密安全哈希。 如果盐的默认值没有改变,你会得到错误。
您可以使用 OpenSSL rand
函数生成一个随机字符串以用作您的秘密盐字符串。 打开一个新终端,再次连接到您的服务器,然后运行以下命令来生成此字符串:
openssl rand -base64 32
-base64 32
选项确保 Base64 编码的字符串长度为 32 个字符。
然后,在配置文件中,找到 'secretsalt'
条目并将 defaultsecretsalt
替换为您生成的字符串:
/var/simplesamlphp/config/config.php
. . . 'secretsalt' => 'your_generated_salt', . . .
然后设置技术联系信息。 此信息将在生成的元数据中可用,SimpleSAMLphp 将自动生成的错误报告发送到您指定的电子邮件地址。 找到以下部分:
/var/simplesamlphp/config/config.php
. . . 'technicalcontact_name' => 'Administrator', 'technicalcontact_email' => 'na@example.org', . . .
将 Administrator
和 na@example.org
替换为适当的值。
然后设置您要使用的时区。 找到此部分:
/var/simplesamlphp/config/config.php
. . . 'timezone' => null, . . .
将 null
替换为 此 PHP 时区列表中的首选时区。 请务必将值括在引号中:
/var/simplesamlphp/config/config.php
. . . 'timezone' => 'America/New_York', . . .
保存并关闭文件。 您现在应该可以通过访问 https://your_domain/simplesaml
在浏览器中访问该站点。 您将在浏览器中看到以下屏幕:
为确保您的 PHP 安装满足 SimpleSAMLphp 顺利运行的所有要求,请选择 Configuration 选项卡并单击 以管理员身份登录 链接。 然后使用您在步骤 3 中的配置文件中设置的管理员密码。
登录后,您将看到 SimpleSAMLphp 使用的必需和可选 PHP 扩展的列表。 检查您是否安装了除 predis/predis
之外的所有扩展:
如果缺少任何必需的组件,请查看本教程并在继续之前安装缺少的组件。
您还会看到一个链接,上面写着 SimpleSAMLphp 设置的健全性检查 。 单击此链接以获取应用于您的设置的检查列表,以查看它们是否成功。
让我们继续为 SimpleSAMLphp 配置身份验证源。
第 4 步 — 配置身份验证源
现在我们已经安装并设置了 SimpleSAMLphp,让我们配置一个身份验证源,以便我们可以对用户进行身份验证。 我们将使用 MySQL 数据库来存储用户名和密码列表以进行身份验证。
要开始使用,请登录 MySQL root 帐户:
mysql -u root -p
系统将提示您输入 MySQL 根帐户密码。 提供它以继续。
接下来,创建一个充当身份验证源的数据库。 我们称之为 auth
。 随意命名你的不同:
CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
现在让我们创建一个单独的 MySQL 用户来专门操作我们的 auth
数据库。 从管理和安全的角度来看,创建单一功能的数据库和帐户是一种很好的做法。 我们将命名我们的用户 authuser。 执行以下命令创建用户,设置密码,并授予它访问我们的 auth
数据库的权限。 请记住在此处为您的新数据库用户提供强密码。
GRANT ALL ON auth.* TO 'authuser'@'localhost' IDENTIFIED BY 'your_mysql_auth_user_password';
现在创建一个 users
表,它将由两个字段组成:username
和 password
。 为了一些额外的安全性,我们将使用 MySQL AES_ENCRYPT()
函数来加密密码字符串,因此我们不会以纯文本形式存储密码。 此函数加密字符串并返回二进制字符串。
CREATE TABLE auth.users(username VARCHAR(30), password VARBINARY(30));
然后将三个用户插入到新创建的表中。 在这里,我们将使用 AES_ENCRYPT()
函数来加密密码字段的值。 您需要提供一个用作加密密钥的字符串。 确保用您自己的字符串替换它,它可以是您想要的任何字符串,只要它很复杂。
INSERT INTO auth.users(username, password) VALUES ('user1', AES_ENCRYPT('user1pass','your_secret_key')), ('user2', AES_ENCRYPT('user2pass','your_secret_key')), ('user3', AES_ENCRYPT('user3pass','your_secret_key'));
为每个用户使用相同的密钥,并确保记住该密钥,以便您以后可以再次使用它来创建其他用户。 您还将在 SimpleSAMLphp 配置中使用此密钥,以便您可以解密密码并将其与用户输入的密码进行比较。
我们需要刷新权限,以便 MySQL 的当前实例知道我们最近所做的权限更改:
FLUSH PRIVILEGES;
通过键入以下命令退出 MySQL 提示:
exit
要在 SimpleSAMLphp 中启用身份提供者功能,我们需要编辑 /var/simplesamlphp/config/config.php
文件。 有几个选项可用,但由于本指南侧重于 SAML 2.0 支持,我们希望启用 enable.saml20-idp
选项。 为此,请打开 /var/simplesamlphp/config/config.php
并启用 SAML 2.0 支持:
nano /var/simplesamlphp/config/config.php
找到文件的这一部分并将 false
替换为 true
。 :
/var/simplesamlphp/config/config.php
... 'enable.saml20-idp' => true, ...
然后保存文件并退出编辑器。
现在我们启用了身份提供者功能,我们需要指明要使用的身份验证模块。 由于我们在 MySQL 数据库上有一个用户表,我们将使用 SQL 身份验证模块。 打开 authsources 配置文件:
nano /var/simplesamlphp/config/authsources.php
找到以下被注释掉的块:
/var/simplesamlphp/config/authsources.php
... /* 'example-sql' => array( 'sqlauth:SQL', 'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml', 'username' => 'simplesaml', 'password' => 'secretpassword', 'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);', ), */ ...
这段代码定义了一个数据库连接和一个查询,SimpleSAMLphp 可以使用它在名为 users
的数据库表中查找用户。 我们需要取消注释并更改查询以使用 MySQL 的 AES_DECRYPT()
函数从我们的表中查找用户。 我们需要为 AES_DECRYPT()
函数提供与我们用于加密查询中的密码相同的密钥。
修改文件的部分以指定数据库连接详细信息和查询:
/var/simplesamlphp/config/authsources.php
... 'example-sql' => array( 'sqlauth:SQL', 'dsn' => 'mysql:host=localhost;port=5432;dbname=auth', 'username' => 'authuser', 'password' => 'your_mysql_auth_user_password', 'query' => 'SELECT username FROM users WHERE username = :username AND AES_DECRYPT(password,"your_secret_key") = :password', ), ...
请务必将您指定的密钥放置在 your_secret_key
的位置。
保存并关闭文件。 让我们测试我们的身份提供者。
第 5 步 — 使用 SAML 2.0 SP 演示测试身份提供程序
您可以通过导航到 Authentication 选项卡并单击 Test configured authentication sources 链接来测试刚刚设置的 MySQL 身份验证源。 您将看到已配置的身份验证源列表。
单击 example-sql,因为这是您在上一步中配置的提供程序。 将出现输入用户名和密码的提示。 输入您在 MySQL users 表中插入的三个测试用户和密码组合中的任何一个。 使用密码 user1pass
尝试 user1
。
尝试成功后,您将看到 SAML 2.0 SP 演示示例 页面:
如果您无法登录并且知道密码正确,请确保您在创建用户时使用的 AES_ENCRYPT()
函数和创建用户时的 AES_DECRYPT()
函数使用了相同的密钥。查找用户。
您现在可以按照 SimpleSAMLphp API 文档 将 SimpleSAMLphp 与您自己的应用程序集成。
结论
现在,您已在 Ubuntu 18.04 VPS 上正确安装和配置了 SimpleSAMLphp 应用程序。 SimpleSAMLphp 还允许通过主题进行广泛的用户界面定制。 您可以参考他们的 主题文档 了解更多信息。