介绍
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数据库中,并测试您可以使用这些用户登录。
前提条件
- 一个 Ubuntu 16.04 服务器设置为 Ubuntu 16.04 初始服务器安装指南,包括一个 sudo 非根用户和一个防火墙。
- Apache, MySQL 和 PHP 安装在服务器上,如下 如何安装 Linux, Apache, MySQL, PHP (LAMP 堆栈) 在 Ubuntu 16.04 ]。
- 一个域名配置为指向您的服务器。 您可以学习如何将域名指向 DigitalOcean Droplets 通过以下 如何使用 DigitalOcean 设置主机名称教程。
- 一个虚拟主机配置为域名使用
ServerName
指南。 [How To Set Up Apache
步骤 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
. 在您的浏览器中,您将看到以下屏幕:
要确保您的 PHP 安装符合 SimpleSAMLphp 运行的所有要求,请选择 ** 配置** 选项卡,然后单击 ** 登录为管理员 ** 链接,然后使用您在步骤 3 中设置的配置文件中的管理员密码。
一旦登录,你会看到一个需要和可选的PHP扩展列表使用的PHP,其中有哪些已经安装在你的系统上。
如果缺少组件,请查看本教程并在继续之前安装缺少的组件。
您还会看到一个链接,该链接说 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身份验证源,通过导航到 身份验证选项卡并点击 测试配置身份验证源链接。
点击 example-sql,因为这是您在上一步配置的服务提供商。 将出现提示输入用户名和密码。 输入您在MySQL用户表中插入的三个测试用户和密码组合中的任何一个。
成功尝试后,您将被介绍到 SAML 2.0 SP Demo 示例页面:
如果您无法登录,并且知道密码是正确的,请确保您在创建用户时使用相同的AES_ENCRYPT()
函数和在搜索用户时使用相同的AES_DECRYPT()
函数。
您现在可以通过遵循 SimpleSAMLphp API 文档将 SimpleSAMLphp 集成到自己的应用程序中。
结论
您现在已经在Ubuntu 16.04 VPS上正确安装和配置了SimpleSAMLphp应用程序,您可以在添加其他身份和服务提供商时探索更多途径。SimpleSAMLphp还允许通过主题进行广泛的用户界面定制。