如何在Ubuntu18.04上安装和配置SimpleSAMLphp以进行SAML身份验证

来自菜鸟教程
跳转至:导航、​搜索

介绍

SimpleSAMLphp 是一个开源 PHP 身份验证应用程序,它为作为服务提供者 (SP) 或身份提供者 (IdP) 的 SAML 2.0 提供支持。

SAML(安全断言标记语言) 是一种基于 XML 的安全通信机制,用于在组织和应用程序之间交换身份验证和授权数据。 它通常用于实现 Web SSO(单点登录)。 这消除了跨多个组织维护多个身份验证凭据的需要。 简而言之,您可以使用一个身份(例如用户名和密码)来访问多个应用程序。

SimpleSAMLphp 的一个实例连接到一个 身份验证源 ,它是一个身份提供者,如 LDAP 或用户数据库。 在授予对链接服务提供商提供的资源的访问权限之前,它会根据此身份验证源对用户进行身份验证。

在本教程中,您将安装 SimpleSamlPHP 并将其配置为使用 MySQL 数据库作为身份验证源。 您将在 MySQL 数据库中存储用户和加密密码,并测试您是否可以使用这些用户登录。

先决条件

第 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',
. . .

Administratorna@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 表,它将由两个字段组成:usernamepassword。 为了一些额外的安全性,我们将使用 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 还允许通过主题进行广泛的用户界面定制。 您可以参考他们的 主题文档 了解更多信息。