Tutorial

Como instalar e configurar o SimpleSAMLphp para autenticação SAML no Ubuntu 18.04

PHPSecurityUbuntu 18.04

Introdução

O SimpleSAMLphp é um aplicativo de autenticação PHP de código aberto, que fornece suporte ao SAML 2.0, como provedor de serviços (SP) ou provedor de identidade (IdP).

O SAML (Security Assertion Markup Language) é um mecanismo de comunicação seguro baseado em XML, criado para trocar dados de autenticação e de autorização entre organizações e aplicativos. Muitas vezes, ele é usado para implementar SSO (Single Sign On) da Web. Isto elimina a necessidade de manter várias credenciais de autenticação em várias organizações. Simplificando, você pode usar uma identidade, como um nome de usuário e senha, para acessar vários aplicativos.

Uma instância do SimpleSAMLphp se conecta a uma origem de autenticação, que é um provedor de identidade tal como o LDAP ou um banco de dados de usuários. Ele autentica usuários usando essa origem de autenticação antes de conceder acesso aos recursos disponibilizados a partir de provedores de serviço vinculados.

Neste tutorial, você instalará o SimpleSamlPHP e o configurará para usar um banco de dados MySQL como uma origem de autenticação. Você armazenará usuários e senhas criptografadas no banco de dados MySQL e testará se é possível usar esses usuários para fazer login.

Pré-requisitos

Passo 1 — Fazendo download e instalando o SimpleSAMLphp

A instalação do SimpleSAMLphp envolve alguns passos. Temos que baixar o software em si, e alguns componentes e pré-requisitos adicionais. Também precisaremos fazer algumas alterações em nossa configuração do Host Virtual.

Faça login em seu servidor se ainda não tiver feito isso.

Faça o download do SimpleSAMLphp no site do projeto. O SimpleSAMLphp sempre vincula a versão estável mais recente dos softwares à mesma URL. Isto significa que podemos obter a versão mais recente, digitando isto:

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

Isto baixará um arquivo comprimido chamado download?latest, que contém o SimpleSAMLphp. Extraia o conteúdo com o comando tar:

  • tar zxf download?latest

Os arquivos serão extraídos para um novo diretório chamado simplesamlphp-1.x.y, onde o x.y é o número da versão atual. Use o comando ls para identificar o arquivo:

  • ls

Você verá o nome do arquivo exibido:

Ouptut
simplesamlphp-1.18.5

Agora, copie o conteúdo do diretório para /var/simplesamlphp, usando o comando cp. O número da versão deve ser substituído pelo número da versão que você tem:

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

O switch -a garante que as permissões de arquivo serão copiadas com os arquivos e pastas. O ponto no final do arquivo de origem garante que tudo no diretório de origem, incluindo arquivos ocultos, seja copiado para o diretório de destino.

Nota: se precisar instalar os arquivos em um local diferente, será necessário atualizar vários arquivos. Consulte a documentação de instalação oficial do SimpleSAMLphp para maiores detalhes.

Há alguns pacotes de software adicionais que o SimpleSAMLphp precisa, incluindo extensões PHP para trabalhar com o XML, strings de múltiplos bytes, curl e LDAP. Ele também exige o memcached. Instale-os usando seu gerenciador de pacotes.

Primeiramente, atualize sua lista de pacotes:

  • sudo apt update

Depois disso, instale os pacotes:

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

Assim que a instalação for concluída, reinicie o Apache para ativar as novas extensões do PHP:

  • sudo systemctl restart apache2

Com o SimpleSAMLphp instalado, vamos configurar o Apache para exibir os arquivos.

Passo 2 — Configurando o Apache para exibir o SimpleSAMLphp

Você já configurou um domínio e o apontou a este servidor. Também configurou o Host Virtual para funcionar com o HTTPS protegendo o Apache com o Let’s Encrypt. Vamos usar isso para exibir o SimpleSAMLphp.

O /var/simplesamlphp/www é o único diretório do SimpleSAMLphp que precisa estar visível para a Web. Para expô-lo à Web, edite o arquivo de configuração do Host Virtual SSH do Apache para seu domínio.

Se o arquivo de configuração do Host Virtual tiver o nome your_domain.conf, o Let’s Encrypt terá criado um novo arquivo de configuração chamado your_domain-le-ssl.conf, que trata os pedidos HTTPS para o domínio. Para editar o arquivo, abra o arquivo de configuração SSL com o comando a seguir. O your_domain deve ser substituído pelo nome real do arquivo:

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

O arquivo deve ficar parecido com o seguinte, embora o arquivo real possa ter comentários mais descritivos:

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>

Aqui, a diretiva ServerName estabelece o domínio base que deve corresponder à definição deste host virtual. Esse deve ser o nome de domínio para o qual você configurou um certificado SSL na seção de Pré-requisitos. Vamos adicionar uma diretiva Alias, que cede ao SimpleSAMLphp o controle sobre todas as URLs que correspondam à página https://your_domain/simplesaml/*​​​.​ Faça isso adicionando a linha seguinte ao arquivo de configuração:

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

...

Isso significa que todas as URLs que correspondam ao domain_name/simplesaml/* serão direcionadas para o diretório /var/simplesamlphp/www​​​, dando o controle ao SimpleSAMLphp.

Em seguida, vamos conceder acesso ao diretório /var/simplesamlphp/www, fornecendo a ele um controle de acesso Require all granted. Isso tornará o serviço SimpleSAMLphp acessível pela Web. Faça isso adicionando o seguinte ao arquivo de configuração:

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

Salve e feche o arquivo. Reinicie o Apache para que as alterações entrem em vigor:

  • sudo systemctl restart apache2

Agora que o Apache está configurado para atender os arquivos do aplicativo, vamos configurar o SimpleSAMLphp.

Passo 3 — Configurando o SimpleSAMLphp

Em seguida, precisamos fazer várias alterações na configuração principal do SimpleSAMLphp, localizada em /var/simplesamlphp/config/config.php. Abra o arquivo no seu editor:

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

Defina a senha do administrador localizando a linha 'auth.adminpassword' e substitua o valor padrão de 123 por uma senha mais segura. Esta senha permite que você acesse algumas páginas em sua interface Web de instalação do SimpleSAMLphp:

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

Em seguida, defina um sal secreto, que deve ser uma string de caracteres gerados aleatoriamente. Algumas partes do SimpleSAMLphp usam este sal para criar hashes seguras de modo criptográfico. Haverá erros se o sal não for alterado do valor padrão.

Utilize a função rand do OpenSSL para gerar uma string aleatória e usá-la como sua string de sal secreta. Abra um novo terminal, conecte-se ao seu servidor novamente e execute o comando a seguir para gerar esta string:

  • openssl rand -base64 32

A opção -base64 32 garante uma string codificada em Base64, que tem 32 caracteres de tamanho.

Em seguida, no arquivo de configuração, localize a entrada 'secretsalt' e substitua o defaultsecretsalt pela string que você gerou:

/var/simplesamlphp/config/config.php
. . .
'secretsalt' => 'your_generated_salt',
. . .

Após isto, defina as informações de contato técnico. Esta informação estará disponível nos metadados gerados, e o SimpleSAMLphp enviará relatórios de erro gerados automaticamente ao endereço de e-mail que você especificar. Localize a seguinte seção:

/var/simplesamlphp/config/config.php
. . .
'technicalcontact_name'     => 'Administrator',
'technicalcontact_email'    => 'na@example.org',
. . .

Substitua o Administrator e o na@example.org com valores adequados.

Em seguida, defina o fuso horário que gostaria de usar. Localize esta seção:

/var/simplesamlphp/config/config.php
. . .
'timezone' => null,
. . .

Substitua o null pelo fuso horário que preferir, a partir desta lista de fusos horários para o PHP. Lembre-se de colocar o valor entre aspas:

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

Salve e feche o arquivo. Agora, você deve conseguir acessar o site em seu navegador visitando https://your_domain/simplesaml. Você verá a tela seguinte em seu navegador:

interface Web simplesaml

Para garantir que sua instalação PHP corresponda a todas as exigências feitas para que o SimpleSAMLphp funcione sem problemas, selecione a guia Configuration e clique no link Login as administrator. Em seguida, use a senha de administrador que você definiu no arquivo de configuração no Passo 3.

Assim que tiver feito login, verá uma lista de extensões PHP obrigatórias e opcionais utilizadas pelo SimpleSAMLphp. Confira se você instalou todas as extensões, com exceção da predis/predis:

Todas as extensões instaladas

Caso esteja faltando algum componente necessário, consulte este tutorial e instale os componentes que faltam antes de continuar.

Você verá também um link que diz Sanity check of your SimpleSAMLphp setup (Verificar integridade de sua configuração SimpleSAMLphp). Clique neste link para obter uma lista de verificações aplicadas à sua configuração e ver se elas foram bem-sucedidas.

Vamos continuar para configurarmos uma origem de autenticação para o SimpleSAMLphp.

Passo 4 — Configurando a origem de autenticação

Com o SimpleSAMLphp instalado e configurado, vamos configurar uma origem de autenticação, para que possamos autenticar usuários. Usaremos um banco de dados MySQL para armazenar uma lista de nomes de usuários e senhas para autenticação.

Para começar, faça login na conta root do MySQL:

  • mysql -u root -p

Será solicitada a senha para a conta root do MySQL. Digite a senha para continuar.

Em seguida, crie um banco de dados que atuará como a origem de autenticação. Vamos chamá-lo de auth. Se quiser, dê outro nome à sua escolha:

  • CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Vamos criar um usuário MySQL separado para operar exclusivamente em nosso banco de dados auth. Do ponto de vista de gerenciamento e segurança, é vantajoso criar bancos de dados e contas de uma só função. Vamos chamar nosso usuário de authuser. Execute o comando a seguir para criar o usuário, definir uma senha e conceder acesso ao nosso banco de dados auth. Lembre-se de dar uma senha forte para seu novo usuário do banco de dados.

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

Agora, crie uma tabela users, que será composta de dois campos: username e password. Para termos uma maior segurança, usaremos a função MySQL AES_ENCRYPT() para criptografar a string de senha, para que não armazenemos as senhas em texto simples. Esta função criptografa uma string e retorna uma string binária.

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

Em seguida, insira três usuários na tabela recém-criada. Usaremos aqui a função AES_ENCRYPT() para criptografar os valores do campo da senha. Será necessário fornecer uma string que será utilizada como uma chave de criptografia. Lembre de substituir isso pela sua própria string, que pode ser qualquer uma, desde que seja complexa.

  • 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'));

Use a mesma chave para cada usuário, e não deixe de lembrar a chave para que possa usá-la novamente para criar usuários adicionais no futuro. Você também usará esta chave secreta na configuração do SimpleSAMLphp, para que você possa decodificar senhas e compará-las com as senhas que os usuários inserem.

Precisamos atualizar os privilégios para que a instância atual do MySQL saiba sobre as alterações de privilégio recentes que fizemos:

  • FLUSH PRIVILEGES;

Saia do prompt do MySQL digitando:

  • exit

Para habilitar a funcionalidade de provedor de identidade no SimpleSAMLphp, precisamos editar o arquivo /var/simplesamlphp/config/config.php. Há várias opções disponíveis, mas, como este guia se concentra no suporte SAML 2.0, queremos habilitar a opção enable.saml20-idp. Para fazer isso, abra o arquivo /var/simplesamlphp/config/config.php e habilite o suporte SAML 2.0:

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

Localize esta seção do arquivo e substitua o false pelo true:

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

Então, salve o arquivo e saia do editor.

Com a funcionalidade de provedor de identidade habilitada, precisamos agora indicar o módulo de autenticação a ser usado. Como temos uma tabela de usuários em um banco de dados MySQL, usaremos o módulo de autenticação SQL. Abra o arquivo de configuração authsources:

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

Localize o seguinte bloco, que está comentado:

/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);',
    ),
    */
...

Este bloco define uma conexão de banco de dados e uma consulta que o SimpleSAMLphp pode utilizar para procurar um usuário em uma tabela de banco de dados chamada users. Precisamos remover a marca de comentário e alterar a consulta para procurar por um usuário de nossa tabela, usando a função AES_DECRYPT() do MySQL. Precisaremos fornecer à função AES_DECRYPT() a mesma chave que usamos para criptografar as senhas na consulta.

Modifique a seção do arquivo para especificar os detalhes de conexão do banco de dados e a consulta:

/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',
    ),
...

A chave secreta que você especificou deve estar no lugar de your_secret_key.

Salve e feche o arquivo. Vamos testar nosso provedor de identidade.

Passo 5 — Testando o provedor de identidade com a demonstração de provedor de serviço do SAML 2.0

É possível testar a origem de autenticação do MySQL que acabou de configurar, navegando até a guia Authentication e clicando no link Test configured authentication sources (testar origens de autenticação configuradas). Você verá uma lista de origens de autenticação já configuradas.

A lista de origens de autenticação configuradas

Clique no example-sql, pois este é o provedor que você configurou no passo anterior. Aparecerá um prompt para digitar seu nome de usuário e senha. Digite qualquer uma das três combinações de usuário e senha de teste que você inseriu na tabela de usuários do MySQL. Teste o user1 com a senha user1pass.

Se tiver sucesso, você verá a página SAML 2.0 SP Demo Example:

Página de demonstração de sucesso

Caso não consiga fazer login e tenha certeza de que a senha está correta, confirme se usou a mesma chave tanto com a função AES_ENCRYPT(), ao criar o usuário, quanto com a função AES_DECRYPT(), ao procurar o usuário.

Agora, você pode integrar o SimpleSAMLphp aos seus próprios aplicativos, seguindo a documentação de API do SimpleSAMLphp.

Conclusão

Você tem o aplicativo SimpleSAMLphp instalado e configurado corretamente em seu VPS Ubuntu 18.04. O SimpleSAMLphp também permite uma ampla personalização da interface de usuário por meio de temas. Consulte o documentos de temas deles para saber mais a respeito.

0 Comments

Creative Commons License