SimpleSAMPLphp是一个开源的PHP身份验证应用程序,它作为服务提供者(SP)以及身份提供者(IdP)来为 SAML 2.0提供支持。
SAML(安全断言标记语言)是一种基于XML的安全通信机制,用于在组织和应用程序之间交换身份验证和授权数据。它通常用于实现Web SSO(单点登录)。这免除了在多个组织中维护多个身份验证凭据的必要。简而言之,您可以使用一个标识(如用户名和密码)来访问多个应用程序。
SimpleSAMLphp的实例会连接到身份验证源,该身份验证源是作为身份提供程序(比如LDAP)或用户数据库存在的。在对链接服务提供商提供的资源授予访问权限之前,它会针对此身份验证源对用户进行身份验证。
在本教程中,将教您安装SimpleSamplPHP并将其配置为基于MySQL数据库的身份验证源。您将在MySQL数据库中存储用户和加密密码,并测试您是否可以使用这些用户登录。
安装SimpleSAMLphp涉及几个步骤。我们必须下载软件以及一些额外的组件。我们还需要对虚拟主机配置进行一些更改。
登录您的服务器。
从网站下载SimpleSAMLphp。SimpleSAMLphp始终使用固定的URL来链接其软件的最新稳定版。这意味着我们可以通过输入以下内容来获取最新版本:
wget https://simplesamlphp.org/download?latest
下载一个包含SimpleSAMLphp 的压缩文件。我们使用tar
命令来提取download?latesttar
内容:
tar zxf download?latest
这些文件将被提取到simplesamlphp-1.x.y
目录,其中的x.y
是当前版本号。使用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)。我们使用包管理器来安装它们。
首先,更新您的包列表:
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。
您已经配置了一个域名指向了该服务器,并且您已通过使用Let的加密保护Apache来设置虚拟主机以使用HTTPS。让我们用它来服务SimpleSAMLphp。
唯一需要对Web可见的SimpleSAMLphp目录是要将其公开给Web,请编辑域名的虚拟主机SSL Apache配置文件/var/simplesamlphp/www
如果您的虚拟主机配置文件已命名为your\_domain.conf
,则会创建一个your\_domain-le-ssl.conf
来处理您域名的HTTPS请求的新配置文件。使用以下命令打开SSL配置文件以编辑该文件。请务必替换your\_domain
为文件的实际名称:
sudo nano /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 :
...
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
Alias /simplesaml /var/simplesamlphp/www
...
这意味着所有匹配domain_name/simplesaml/
的URL 都将定向到提供SimpleSAMLphp控制的目录/var/simplesamlphp/www
中。
接下来,我们将通过为其指定访问控制Require all granted
来授予对目录/var/simplesamlphp/www
的访问权限。这将使SimpleSAMLphp服务可通过Web访问。通过在配置文件中添加以下内容来执行此操作:
...
Alias /simplesaml /var/simplesamlphp/www
<Directory /var/simplesamlphp/www/>
Require all granted
</Directory>
...
保存并关闭文件。重新启动Apache以使更改生效:
sudo systemctl restart apache2
Apache已配置为提供应用程序的文件,那么让我们来配置SimpleSAMLphp。
接下来,我们需要对位于/var/simplesamlphp/config/config.php
的核心SimpleSAMLphp配置进行一些更改。在编辑器中打开文件:
nano /var/simplesamlphp/config/config.php
通过查找'auth.adminpassword'
并使用更安全的密码替换默认值123
来设置管理员密码。使用此密码可以访问SimpleSAMLphp安装Web界面中的某些页面:
. . .
'auth.adminpassword' => 'your_admin_password',
. . .
接下来,设置一个secrest salt,它应该是一个随机生成的字符串。SimpleSAMLphp的某些部分使用此salt来创建加密安全哈希值。如果没有更改salt默认值,系统就会报错!
您可以使用OpenSSLrand
函数生成随机字符串以用作您的secret salt字符串。打开一个新终端,再次连接到您的服务器,然后运行以下命令来生成此字符串:
openssl rand -base64 32
-base64 32
选项确保Base64编码的字符串长度为32个字符。
然后,在配置文件中,找到'secretsalt'
并替换defaultsecretsalt
为您生成的字符串:
. . .
'secretsalt' => 'your_generated_salt',
. . .
然后设置联系信息。此信息将在生成的元数据中提供,SimpleSAMLphp将自动生成的错误报告发送到您指定的邮箱中。定位到以下部分:
. . .
'technicalcontact_name' => 'Administrator',
'technicalcontact_email' => 'na@example.org',
. . .
替换Administrator
和na@example.org
并设置为你自己的值。
然后设置您要使用的时区,注意设置到你的位置。
. . .
'timezone' => null,
. . .
从 PHP的时区列表中替换null
为首选时区。请务必将值括在引号中:
. . .
'timezone' => ' Asia/Shanghai',
. . .
保存并关闭文件。您现在应该可以通过访问https://yourdomain/simplesaml来访问浏览器中的站点。您将在浏览器中看到下面的内容:
要确保PHP安装满足SimpleSAMLphp顺利运行的所有要求,选择 Configuration 选项卡,然后单击 Login as administrator 链接。然后使用您在步骤3的配置文件中设置的管理员密码。
登录后,您将看到SimpleSAMLphp使用的必需和可选PHP扩展的列表,以及哪些已经安装在您的系统上。如果您的安装程序已安装所有PHP扩展,则您的浏览器将如下所示:
如果缺少组件,请安装缺少的组件。
您还会看到一个链接,叫做 Sanity check of your SimpleSAMLphp setup 。单击此链接可获取应用于您的设置的检查列表。
让我们继续为SimpleSAMLphp配置身份验证源。
现在我们已经安装并设置了SimpleSAMLphp,让我们配置一个身份验证源,以便我们对用户进行身份验证。我们将使用MySQL数据库来存储用于进行身份验证的用户名和密码列表。
请登录MySQL root 帐户:
mysql -u root -p
系统将提示您输入MySQL root帐户密码。
接下来,创建一个充当身份验证源的数据库。我们称之为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表,它将由两个字段组成:username
和password
。为了安全性,我们将使用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
找到文件的这一部分:
...
'enable.saml20-idp' => false,
...
将false替换为true。然后保存文件并退出编辑器。
现在我们已启用身份提供程序功能,我们需要指明要使用的身份验证模块。由于MySQL数据库上有用户表,因此我们将使用SQL身份验证模块。打开authsources配置文件:
nano /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()
函数提供与查询中密码加密相同的密钥。
修改文件部分以指定数据库连接详细信息和查询:
...
'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放置您指定的密钥。
保存并关闭文件。让我们测试我们的身份。
您可以通过导航到" 身份验证" 选项卡并单击" 测试配置的身份验证源" 链接来 测试 刚刚设置的MySQL身份 验证源 。您将看到已配置的身份验证源列表。
单击 example-sql ,因为这是您在上一步中配置的提供程序。接下来将出现输入用户名和密码的提示。输入您在MySQL用户表中插入的三个测试用户和密码组合中的任何一个。尝试使用user1和密码pass。
您将看到 SAML 2.0 SP演示示例 页面:
如果您无法登录并且您知道密码是正确,请确保在创建用户时使用与AES\_ENCRYPT()
功能相同的密钥,以及在查找用户时使用AES\_DECRYPT()
功能。
您现在可以通过遵循 SimpleSAMLphp API文档将SimpleSAMLphp与您自己的应用程序集成。
您现在已在Ubuntu 16.04 VPS上正确安装和配置了SimpleSAMLphp应用程序。您可以在添加其他身份和服务提供者的过程中探索更多途径。SimpleSAMLphp还允许用户通过主题进行广泛的用户界面定制。
腾讯云也提供了相应的产品保护您的安全,详情请点击:https://cloud.tencent.com/product/bad?idx=2
参考文献:《How to Install and Configure SimpleSAMLphp for SAML Authentication on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。