如何在 Ubuntu 16.04 上安装和配置用于 SAML 身份验证的 SimpleSAMLphp

介绍

SimpleSAMLphp是一个开源的PHP身份验证应用程序,支持SAML 2.0(http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html)作为服务提供商(SP)或身份提供商(IdP)。

SAML (Security Assertion Markup Language) 是一种安全的基于 XML 的通信机制,用于组织和应用程序之间交换身份验证和授权数据。 它通常用于实现 Web SSO (单个登录)。

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

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

前提条件

步骤 1 — 下载和安装 SimpleSAMLphp

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

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

SimpleSAMLphp从该项目的网站下载. SimpleSAMLphp总是将其软件的最新稳定版本链接到相同的URL。

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

这将下载一个被压缩的文件,名为download?latest,其中包含SimpleSAMLphp。

1tar zxf download?latest

文件将被提取到一个新的目录标记为simplesamlphp-1.x.y,其中x.y是当前版本号码。

1ls

你会看到显示的文件名:

1[secondary_label Ouptut]
2simplesamlphp-1.14.14

现在,使用cp命令将目录的内容复制到 `/var/simplesamlphp。

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

a交换器确保文件权限与文件和文件夹一起被复制.源文件末端的点点确保源目录中的所有内容,包括隐藏的文件都被复制到目标目录。

<$>[注] 注: 如果您需要在不同的位置安装文件,则需要更新多个文件。请参阅SimpleSAMLphp的官方 安装文档以获取详细信息。

有几个额外的软件包SimpleSAMLphp需要,包括PHP扩展来与XML,多字节字符串,‘curl’和LDAP工作。它还需要memcached

首先,更新您的包列表:

1sudo apt-get update

然后安装这些包:

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

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

1sudo systemctl restart apache2

现在 SimpleSAMLphp 已安装,让我们配置 Apache 来服务这些文件。

步骤 2 — 配置 Apache 以服务 SimpleSAMLphp

你已经配置了一个域,指向这个服务器,你已经设置了一个虚拟主机以与HTTPS合作,通过使用Let's Encrypt保护Apache。

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

如果您的虚拟主机配置文件被命名为 your_domain.conf,那么 Let's Encrypt 会创建一个名为 your_domain-le-ssl.conf 的新的配置文件,该文件处理您的域的 HTTPS 请求。

1sudo nano /etc/apache2/sites-available/your_domain-le-ssl.conf

文件应该看起来如下,虽然实际文件可能有更为描述性的评论:

 1[label /etc/apache2/sites-available/your_domain-le-ssl.conf]
 2<IfModule mod_ssl.c>
 3<VirtualHost *:443>
 4        ServerName your_domain
 5
 6        ServerAdmin webmaster@localhost
 7        DocumentRoot /var/www/html
 8
 9        ErrorLog ${APACHE_LOG_DIR}/error.log
10        CustomLog ${APACHE_LOG_DIR}/access.log combined
11
12SSLCertificateFile /etc/letsencrypt/live/your_domain/fullchain.pem
13SSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pem
14Include /etc/letsencrypt/options-ssl-apache.conf
15</VirtualHost>
16</IfModule>

这里的ServerName指令定义了这个虚拟主机定义应该匹配的基本域名。这应该是您在 Prerequisites 部分设置 SSL 证书的域名。让我们添加一个Alias指令,该指令为 SimpleSAMLphp 提供所有匹配 https://your_domain/simplesaml/* 的 URL 的控制:

1...
2[label /etc/apache2/sites-available/your_domain-le-ssl.conf]
3  ServerAdmin webmaster@localhost
4  DocumentRoot /var/www/html
5
6  Alias /simplesaml /var/simplesamlphp/www
7
8...

这意味着所有匹配 domain_name/simplesaml/* 的 URL 都将被引导到 /var/simplesamlphp/www 目录中,以便控制 SimpleSAMLphp。

接下来,我们将允许访问 /var/simplesamlphp/www 目录,为其指定一个 `Require all granted' 访问控制. 这将使 SimpleSAMLphp 服务可通过 Web 访问。

1[label /etc/apache2/sites-available/your_domain-le-ssl.conf]
2...
3  Alias /simplesaml /var/simplesamlphp/www
4  <Directory /var/simplesamlphp/www/>
5      Require all granted
6  </Directory>
7...

保存并关闭文件. 重新启动 Apache 以便更改生效:

1sudo systemctl restart apache2

现在Apache已配置为服务应用程序文件,让我们配置SimpleSAMLphp。

步骤 3 — 配置 SimpleSAMLphp

接下来,我们需要对位于 `/var/simplesamlphp/config/config.php 位置的核心 SimpleSAMLphp 配置进行若干更改。

1nano /var/simplesamlphp/config/config.php

将管理员密码设置为auth.adminpassword字段,并用更安全的密码取代123的默认值。

1[label /var/simplesamlphp/config/config.php]
2. . .
3'auth.adminpassword'        => 'your_admin_password',
4. . .

接下来,设置一个秘密盐,这应该是一个随机生成的字符串。SimpleSAMLphp的某些部分使用这种盐来创建加密安全的哈希。

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

1openssl rand -base64 32

-base64 32 选项确保一个 Base64 编码的字符串长达 32 个字符。

然后,在配置文件中,找到``secretsalt的输入,并用您生成的字符串代替defaultsecretsalt`:

1[label /var/simplesamlphp/config/config.php]
2. . .
3'secretsalt' => 'your_generated_salt',
4. . .

然后设置技术联系信息. 此信息将在生成的元数据中可用,而SimpleSAMLphp将将自动生成的错误报告发送到您指定的电子邮件地址。

1[label /var/simplesamlphp/config/config.php]
2. . .
3'technicalcontact_name'     => 'Administrator',
4'technicalcontact_email'    => '[email protected]',
5. . .

管理员[email protected]替换为相应的值。

然后设置您想要使用的时区. 查找此部分:

1[label /var/simplesamlphp/config/config.php]
2. . .
3'timezone' => null,
4. . .

null替换为从 [PHP 的这个时区列表] 的偏好时区(http://php.net/manual/en/timezones.php)。

1[label /var/simplesamlphp/config/config.php]
2. . .
3'timezone' => 'America/New_York',
4. . .

保存并关闭该文件. 您现在应该能够访问您的浏览器中的网站,通过访问 https://your_domain/simplesaml. 在您的浏览器中,您将看到以下屏幕:

simplesaml web interface

要确保您的 PHP 安装符合 SimpleSAMLphp 运行的所有要求,请选择 ** 配置** 选项卡,然后单击 ** 登录为管理员 ** 链接,然后使用您在步骤 3 中设置的配置文件中的管理员密码。

一旦登录,你会看到一个需要和可选的PHP扩展列表使用的PHP,其中有哪些已经安装在你的系统上。

All extensions installed

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

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

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

步骤 4 – 配置身份验证源

现在我们已经安装和设置了SimpleSAMLphp,让我们配置一个身份验证源,以便我们可以验证用户。

要开始,请登录MySQL root帐户:

1mysql -u root -p

您将被要求提供 MySQL 根帐户密码,以便继续使用。

接下来,创建一个作为身份验证源的数据库,我们将称之为auth

1CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

现在让我们创建一个单独的MySQL用户来专门在我们的auth数据库中运行。从管理和安全的角度来看,创建单功能数据库和帐户是很好的做法。我们将命名我们的用户 authuser。 执行下面的命令来创建用户,设置密码,并允许其访问我们的auth数据库。

1GRANT ALL ON auth.* TO 'authuser'@'localhost' IDENTIFIED BY 'your_mysql_auth_user_password';

现在创建一个用户表,它将由两个字段组成:用户名密码。为了获得额外的安全性,我们将使用MySQL AES_ENCRYPT()函数来加密密码串,以便我们不会将密码存储在简单的文本中。

1CREATE TABLE auth.users(username VARCHAR(30), password VARBINARY(30));

然后将三个用户插入新创建的表中,这就是我们将使用AES_ENCRYPT()函数来加密密码字段的值的地方,您需要提供一个用作加密密钥的字符串。

1INSERT INTO auth.users(username, password) VALUES 
2('user1', AES_ENCRYPT('user1pass','your_secret_key')), 
3('user2', AES_ENCRYPT('user2pass','your_secret_key')), 
4('user3', AES_ENCRYPT('user3pass','your_secret_key'));

使用相同的密钥为每个用户,并确保记住密钥,这样你可以再次使用它来创建额外的用户在未来. 你也将使用这个秘密密钥在SimpleSAMLphp配置,所以你可以解密密码与人们输入的对比。

我们需要清除特权,以便当前的MySQL实例知道我们最近所做的特权更改:

1FLUSH PRIVILEGES;

通过键入离开 MySQL 提示:

1exit

要在 SimpleSAMLphp 中启用身份提供者功能,我们需要编辑 /var/simplesamlphp/config/config.php 文件. 有几个选项可用,但由于本指南专注于 SAML 2.0 支持,我们希望启用 enable.saml20-idp 选项。 要做到这一点,打开 /var/simplesamlphp/config/config.php 并启用 SAML 2.0 支持:

1nano /var/simplesamlphp/config/config.php

查找此檔案的部分:

1[label /var/simplesamlphp/config/config.php]
2...
3'enable.saml20-idp' => false,
4...

替换为,然后保存文件并退出编辑器。

现在我们已经启用了身份提供者功能,我们需要指定要使用的身份验证模块. 由于我们在MySQL数据库上有用户表,我们将使用SQL身份验证模块。

1nano /var/simplesamlphp/config/authsources.php

查找以下块,它被评论出来:

 1[label /var/simplesamlphp/config/authsources.php]
 2...
 3    /*
 4    'example-sql' => array(
 5        'sqlauth:SQL',
 6        'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml',
 7        'username' => 'simplesaml',
 8        'password' => 'secretpassword',
 9        'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);',
10    ),
11    */
12...

这个代码定义了一个数据库连接和一个查询,SimpleSAMLphp可以用来搜索一个名为用户的数据库表中的用户。我们需要删除评论并更改查询以使用MySQL的AES_DECRYPT()函数从我们的表中查找用户。

更改文件的部分,以指定数据库连接详细信息和查询:

 1[label /var/simplesamlphp/config/authsources.php]
 2...
 3    'example-sql' => array(
 4        'sqlauth:SQL',
 5        'dsn' => 'mysql:host=localhost;port=5432;dbname=auth',
 6        'username' => 'authuser',
 7        'password' => 'your_mysql_auth_user_password',
 8        'query' => 'SELECT username FROM users WHERE username = :username AND AES_DECRYPT(password,"your_secret_key") = :password',
 9    ),
10...

请确保将您指定的秘密密钥放置在your_secret_key的位置。

保存并关闭文件. 让我们测试我们的身份提供商。

步骤 5 — 使用 SAML 2.0 SP 演示器测试身份提供商

您可以测试您刚刚设置的MySQL身份验证源,通过导航到 身份验证选项卡并点击 测试配置身份验证源链接。

The list of configured authentication sources

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

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

The successful Demo page

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

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

结论

您现在已经在Ubuntu 16.04 VPS上正确安装和配置了SimpleSAMLphp应用程序,您可以在添加其他身份和服务提供商时探索更多途径。SimpleSAMLphp还允许通过主题进行广泛的用户界面定制。

Published At
Categories with 技术
comments powered by Disqus