如何在Ubuntu 16.04上安装和配置SimpleSAMLphp进行SAML验证

SimpleSAMPLphp是一个开源的PHP身份验证应用程序,可以为SAML 2.0作为服务提供商(SP)或身份提供者(IdP)提供支持。在本教程中,您将安装SimpleSamplPHP并将其配置为使用MySQL数据库作为身份验证源。您将在MySQL数据库中存储用户和加密密码,并测试可以使用这些用户登录。

介绍

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

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

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

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

先决条件

第1步 - 下载并安装SimpleSAMLphp

安装SimpleSAMLphp涉及几个步骤。 我们必须下载软件本身以及一些额外的组件和先决条件。 我们还需要对我们的虚拟主机配置进行一些更改。

如果您尚未登录,请登录到您的服务器。

从项目的网站下载SimpleSAMLphp。 SimpleSAMLphp始终将最新的稳定版本的软件链接到同一个URL。 这意味着我们可以通过键入以下内容获得最新版本:

wget https://simplesamlphp.org/download?latest

这将下载一个名为download?latest的压缩文件,其中包含SimpleSAMLphp。 使用tar命令解压缩内容:

tar zxf download?latest

文件将被提取到一个名为simplesamlphp-1. xy的新目录simplesamlphp-1. xy simplesamlphp-1. xy ,其中xy是当前版本号。 使用ls命令来识别文件:

ls simplesamplphp-1*

您会看到文件名显示:

simplesamlphp-1.14.14

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

sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/

-a开关确保文件权限与文件和文件夹一起复制。 源文件末尾的点确保包含隐藏文件的源目录中的所有内容都被复制到目标目录。

注意:如果您需要在不同的位置安装文件,则需要更新多个文件。 有关详细信息,请参阅SimpleSAMLphp的官方安装文档

还有一些SimpleSAMLphp需要的附加软件包,包括使用XML的PHP​​扩展,多字节字符串, curl和LDAP。 它还需要memcached 使用您的包管理器安装这些。

FIrst,更新您的包列表:

sudo apt-get update

然后安装软件包:

sudo apt-get install php-xml php-mbstring php-curl php-memcache php-ldap memcached

安装完成后,重新启动Apache以激活新的PHP扩展:

sudo systemctl restart apache2

现在安装了SimpleSAMLphp,让我们配置Apache来提供这些文件。

第2步 - 配置Apache服务SimpleSAMLphp

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

需要对Web可见的唯一SimpleSAMLphp目录是/var/simplesamlphp/www 要将其公开到Web,请编辑您的域的虚拟主机SSL Apache配置文件。

如果您的虚拟主机配置文件命名为your_domain .conf ,那么我们加密会创建一个名为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指令,为所有匹配https:// your_domain /simplesaml/* URL控制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

...

这意味着所有匹配domain_name /simplesaml/* URL都将被引导到/var/simplesamlphp/www目录中,从而给出SimpleSAMLphp控件。

接下来,我们将通过为其指定“ Require all granted访问控制”来Require all granted/var/simplesamlphp/www目录的访问权限。 这将使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的核心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选项可确保32位字符长的Base64编码字符串。

然后,在配置文件中,找到'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访问浏览器中的网站。 您将在浏览器中看到以下屏幕:

simplesaml web界面

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

登录后,您将看到SimpleSAMLphp使用的必需和可选的PHP扩展列表,以及其中哪些已经安装在系统上。 如果您的安装程序安装了所有PHP扩展,您的屏幕将如下所示:

已安装所有扩展

如果缺少组件,请查看本教程并安装缺少的组件,然后再继续。

您还将看到一个链接,说明您的SimpleSAMLphp设置的Sanity检查 单击此链接以获取应用于您的设置的检查列表,以查看它们是否成功。

我们继续为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

找到文件的这一部分:

/var/simplesamlphp/config/config.php
...
'enable.saml20-idp' => false,
...

false替换为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的数据库表中的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身份验证源 您将看到已配置的身份验证源列表。

配置的认证源列表

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

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

成功的演示页面

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

您现在可以通过遵循SimpleSAMLphp API文档将SimpleSAMLphp与您自己的应用程序进行集成。

结论

您现在可以在Ubuntu 16.04 VPS上正确安装并配置了SimpleSAMLphp应用程序。 您可以探索更多的途径来添加其他身份和服务提供者。 SimpleSAMLphp还允许通过主题进行广泛的用户界面定制。 您可以参考他们的主题文档了解更多信息。