如何在 Ubuntu 18.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?latestSimpleSAMLphp的压缩文件使用以下tar命令提取内容

  • tar zxf download?latest

这些文件将被解压到一个新目录中,标记为,其中是当前版本号。使用命令来识别文件:simplesamlphp-1.x.yx.yls

  • ls

您将看到显示的文件名:

Ouptut
simplesamlphp-1.18.5

现在,将目录的内容复制到/var/simplesamlphp使用cp命令。请务必将版本号替换为您拥有的版本:

  • 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

您已经配置了一个域并指向该服务器,并且您已经通过使用 Let’s Encrypt 保护 Apache 来设置一个使用 HTTPS 的虚拟主机。让我们用它来为 SimpleSAMLphp 提供服务。

唯一需要对网络可见的 SimpleSAMLphp 目录是/var/simplesamlphp/www. 要将其公开给 Web,请编辑域的虚拟主机 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

该文件应如下所示,但实际文件可能有更多描述性注释:

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此处指令定义了应与此虚拟主机定义匹配的基本域。这应该是您在先决条件部分中为其设置 SSL 证书的域名让我们添加一个Alias指令,让 SimpleSAMLphp 控制所有匹配. 通过将以下行添加到配置文件中来做到这一点:https://your_domain/simplesaml/*

your_domain-le-ssl.conf’>/etc/apache2/sites-available/ your_domain -le-ssl.conf
...
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html

  Alias /simplesaml /var/simplesamlphp/www

...

这意味着所有匹配的 URLdomain_name/simplesaml/*将被定向到/var/simplesamlphp/www提供 SimpleSAMLphp 控制目录。

接下来,我们将通过为其/var/simplesamlphp/www指定Require all granted访问控制来授予对该目录的 访问权限。这将使 SimpleSAMLphp 服务可以通过 Web 访问。通过在配置文件中添加以下内容来做到这一点:

your_domain-le-ssl.conf’>/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. 在编辑器中打开文件:

  • nano /var/simplesamlphp/config/config.php

通过定位该'auth.adminpassword'行并123使用更安全的密码替换默认值来设置管理员密码。此密码可让您访问 SimpleSAMLphp 安装 Web 界面中的某些页面:

/var/simplesamlphp/config/config.php
. . .
'auth.adminpassword'        => 'your_admin_password',
. . .

接下来,设置一个秘密盐,它应该是一个随机生成的字符串。SimpleSAMLphp 的某些部分使用这种盐来创建加密安全的哈希。如果盐值未从默认值更改,您将收到错误消息。

您可以使用 OpenSSLrand函数生成一个随机字符串以用作您的秘密盐字符串。打开一个新终端,再次连接到您的服务器,然后运行以下命令来生成此字符串:

  • 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,
. . .

替换为 PHP 时区列表中null的首选时区请务必将值括在引号中:

/var/simplesamlphp/config/config.php
. . .
'timezone' => 'America/New_York',
. . .

保存并关闭文件。您现在应该可以通过访问在浏览器中访问该站点您将在浏览器中看到以下屏幕:https://your_domain/simplesaml

简单的网络界面

为了确保您的 PHP 安装满足 SimpleSAMLphp 顺利运行的所有要求,请选择配置选项卡并单击以管理员身份登录链接。然后使用您在步骤 3 中的配置文件中设置的管理员密码。

登录后,您将看到 SimpleSAMLphp 使用的必需和可选 PHP 扩展的列表。检查您是否安装了每个扩展,除了predis/predis

安装了所有扩展

如果缺少任何必需的组件,请在继续之前查看本教程并安装缺少的组件。

您还会看到一个链接,上面写着对您的 SimpleSAMLphp 设置进行健全性检查单击此链接可获取应用于您的设置的检查列表,以查看它们是否成功。

让我们继续为 SimpleSAMLphp 配置身份验证源。

第 4 步 – 配置身份验证源

现在我们已经安装并设置了 SimpleSAMLphp,让我们配置一个身份验证源,以便我们可以对用户进行身份验证。我们将使用 MySQL 数据库来存储用户名和密码列表以进行身份​​验证。

首先,登录到 MySQL帐户:

  • 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

找到文件的这一部分并替换falsetrue.

/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 演示测试身份提供者

您可以通过导航到“身份验证”选项卡并单击“测试配置的身份验证源”链接测试刚刚设置的 MySQL 身份验证源您将看到已配置的身份验证源列表。

配置的认证源列表

单击example-sql,因为这是您在上一步中配置的提供程序。将出现输入用户名和密码的提示。输入您在 MySQL 用户表中插入的三个测试用户和密码组合中的任何一个。user1用密码试试user1pass

成功尝试后,您将看到SAML 2.0 SP 演示示例页面:

成功的Demo页面

如果您无法登录并且知道密码正确,请确保AES_ENCRYPT()在创建用户AES_DECRYPT()函数查找用户时函数使用相同的密钥

您现在可以按照SimpleSAMLphp API 文档将 SimpleSAMLphp 与您自己的应用程序集成

结论

您现在已经在 Ubuntu 18.04 VPS 上正确安装和配置了 SimpleSAMLphp 应用程序。SimpleSAMLphp 还允许通过主题进行广泛的用户界面定制。您可以参考他们的主题文档了解更多信息。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁