Nesta página você pode encontrar informações para configurar o GuardianKey em seu aplicativo da web.
A interação com o GuardianKey é feita por uma API (Application Programming Interface). Nós fornecemos uma implementação de referência em PHP e Python (bibliotecas). A interação com o GuardianKey é fácil, você pode usar nossas bibliotecas ou implementar seu próprio código. Ambas as formas são documentadas aqui, em subseções distintas.
Observamos que também fornecemos plugins para softwares comumente usados que se integra com o GuardianKey de uma maneira muito simples: basta instalar e usar! Confira nossa página de plugins para ver se o software já é suportado via plugins.
Recomendamos que você faça uso de nossa implementação de referência para evitar bugs e tornar seu trabalho mais simples.
Conteúdo
Visão geral sobre o GuardianKey
O GuardianKey está focado em fornecer uma maneira moderna, inteligente e altamente segura de proteger seus sistemas na fase de autenticação.
Em suma:
- Você registra seu sistema;
- Seu sistema usa as informações do registro (no painel do GuardianKey) para enviar tentativas de login ao GuardianKey (na nuvem);
- O GuardianKey processa os eventos com algoritmos de Inteligência Artificial para fornecer um risco para cada tentativa de login;
- Com base em limites predefinidos, sua equipe de segurança e / ou o usuário podem ser notificados por e-mail;
- Além disso, para riscos de alto nível, seu sistema pode bloquear ou exigir mais etapas para a autenticação (por exemplo, um segundo fator de autenticação); e
- Finalmente, você pode ver tudo (eventos, gráficos, tendências, etc.) em nossa interface administrativa.
Você pode configurar os limites com base nos seus níveis de aceitação de risco, veja como usando a interface administrativa.
Interagindo com GuardianKey
Tecnicamente, a interação com o GuardianKey é feita pelas seguintes fases:
- registrar: criar chaves criptográficas, obter um authgroupID em GuardianKey e registrar opções de notificação;
- envio de eventos: seu sistema envia tentativas de login (eventos) para serem processadas no GuardianKey; e
- monitoramento: você acessa a interface de administração do GuardianKey para monitorar os riscos de seus sistemas e configurar suas preferências.
Em suma:
- o registro (cadastro) é feito pelo Painel do GuardianKey;
- alertas são enviados através de um JSON criptografado usando UDP ou REST; e
- o monitoramento pode ser feito através da nossa interface administrativa.
Abaixo, descrevemos as interações descritas nas fases 1 e 2.
Para as pessoas impacientes, corra rápido!
Os comandos abaixo fornecem uma maneira rápida de criar uma página de login em PHP ou Python, usando nossa implementação de API de referência.
#!/bin/sh
# Install PHP with extensions curl and ...
$ sudo apt-get install php php-json php-curl
OR
$ sudo yum install php php-json php-curl
# Download the class of GuardianKey
$ wget https://github.com/guardiankey/guardiankey-api-php/archive/master.zip
# copy the Keys of GuardiaKey Panel to the top of the file guardiankey-class.php, example:
$GKconfig = array(
'email' => '[email protected]',
'agentid' => 'xxxxxxxxxxx',
'key' => 'xxxxxxxxxxx',
'iv' => 'xxxxxxxxxxx',
'orgid' => 'xxxxxxxxxxx',
'groupid' => 'xxxxxxxxxxx',
'reverse' => '1',
);
# Now, you should make a call for this function in the login processing code of your system
# Link to the code above, as in the example below.
<?php
// This is my system's login page
require_once("guardiankey.class.php");
$GK = new guardiankey();
if ($_POST) {
...
$GK->send_event($username);
echo "<h2>Any data</h2>";
}
#!/bin/sh
# Install Python dependencies using pip:
$ pip install requests json hashlib time
# Download the class
$ wget https://github.com/guardiankey/guardiankey-api-python/archive/master.zip
# copy the Keys of GuardiaKey Panel to the top of the file guardiankey.py, example:
GKconfig = {}
GKconfig['email'] = '[email protected]'
GKconfig['agentid'] = 'xxxxxxxxxxx'
GKconfig['key'] = 'xxxxxxxxxxx'
GKconfig['iv'] = 'xxxxxxxxxxx'
GKconfig['service'] = 'Myservice'
GKconfig['orgid'] = ''
GKconfig['groupid'] = ''
GKconfig['reverse'] = '1'
Links Úteis:
Realizando o registro
Um registro (cadastro) prévio é necessário para enviar eventos ao GuardianKey. Isso deve ser feito utilizando o Painel do GuardianKey.
Enviando eventos
O envio de um evento pode ser feito basicamente seguindo as etapas:
- Etapa 1: crie um JSON contendo as informações sobre o evento (veja a [estrutura] (# detalhes-sobre-o-json-data-estrutura) abaixo);
- Etapa 2: criptografar o JSON usando o KEY / IV gerado na fase de registro;
- Etapa 3: envie a string “authgroupID | cipher” para GuardianKey via UDP ou REST;
- Etapa 4: se você usar o modo de sincronização (usando apenas REST), você deve receber “ALLOW”,“NOTIFY”,“HARD NOTIFY” ou “BLOCK”, que pode ser usado para bloquear o usuário ou exigir um fator extra para o usuário para autenticar.
A API do GuardianKey suporta o recebimento de eventos via UDP ou REST. O UDP é mais rápido, mas é usado exclusivamente para registrar eventos para notificação, ou seja, o seu sistema não receberá um feedback a tempo de bloquear a tentativa de login, mas o seu CSIRT e os usuários podem receber os alertas.
A interface REST é síncrona, a escolha entre eles depende de o suporte dado pela linguagem de programação usada para essas tecnologias e aos requisitos de segurança.
Modo | Vantagens |
---|---|
UDP (async) | rápido |
REST (sync) | Habilita bloqueio de acesso |
Enviando eventos usando a implementação da API de referência
Certifique-se de ter baixado a implementação de referência:
- PHP – https://github.com/guardiankey/guardiankey-api-php/
- Python – https://github.com/guardiankey/guardiankey-api-python/
Você precisará incluir sua KEY / IV, AgentID e outras informações na parte superior do arquivo, como no código de exemplo abaixo. Em sua implementação, você pode salvar essas informações em um banco de dados e recuperá-las quando necessário.
<?php
$GKconfig = array(
'email' => "", // Your admin e-mail
'agentid' => "", // the hash returned in the register phase
'key' => "", // the Key generated in the register phase
'iv' => "", // the IV generated in the registrer phase
'orgid' => "", // use the same value as agentid in first use
'groupid' => "", // use the same value as agentid in first use
'reverse' => "1", // 1 or 0, to make reverse DNS
// querying for sending
);
# Please run register.py for generate your configuration
GKconfig = {}
GKconfig['email'] = ''
GKconfig['agentid'] = ''
GKconfig['key'] = ''
GKconfig['iv'] = ''
GKconfig['service'] = ''
GKconfig['orgid'] = ''
GKconfig['groupid'] = ''
GKconfig['reverse'] = ''
Depois de salvar esses parâmetros no arquivo guardiankey.class.php ou guardiankey.py, você pode fazer uso dele, como nos seguintes códigos:
<?php
echo "<h2>My Login Page</h2>
<p>Please login</p>
<form action=# method=post>
<p>Username:<input type=text name=user></p>
<p>Password:<input type=password name=password></p>
<input type=submit value=submit>
</form>";
if ($_POST) {
// $systemBlockedAccess is true if your system denied the access,
// for example, if $username or $password are is valid.
// Possible values: 0 - username and password is valid,
// 1 - username and password NOT is valid
$systemBlockedAccess= yourLoginFunction($username,$password);
require_once("guardiankey.class.php");
$GK = new guardiankey();
$GK->sendevent($username,$systemBlockedAccess);
}
<?php
echo "<h2>My Login Page</h2>
<p>Please login</p>
<form action=# method=post>
<p>Username:<input type=text name=user></p>
<p>Password:<input type=password name=password></p>
<input type=submit value=submit>
</form>";
if ($_POST) {
// $systemBlockedAccess is true if your system denied the access,
// for example, if $username or $password are is valid.
// Possible values: 0 - username and password is valid,
// 1 - username and password NOT is valid
$systemBlockedAccess= yourLoginFunction($username,$password);
require_once("guardiankey.class.php");
$GK = new guardiankey();
$GKReturn = json_decode($GK->checkaccess($username,$systemBlockedAccess));
if($GKReturn['response'] === "ALLOW") {
echo "<h2>Allowed!</h2>";
}else if($$GKReturn['action'] === "EXTRAREQUIREMENT") {
echo "<h2>Require OTP or something else. If not supported, ";
echo " you can just allow or deny the access, depending the security policy.</h2>";
}else{
echo "<h2>Your access was blocked! Contact the admin!</h2>";
}
}
println "This is tab 2."
Nota: Seu sistema deve enviar até mesmo as tentativas de login não autorizadas (login / pass não correspondem). GuardianKey será executado se você não enviar tal evento, no entanto, esta informação é útil para o nosso Aprendizado de Máquina procedimentos e proporcionar uma melhor experiência de visualização.
Criando seu próprio código para enviar eventos
O GuardianKey basicamente requer as informações sobre o endereço IP do cliente, o User-Agent enviado pelo navegador do usuário e se o login falhou no sistema. Essas informações estão disponíveis na solicitação do usuário e na rotina de verificação do sistema.
Abaixo apresentamos um exemplo usando a linguagem PHP.
<?php
// The KEY and IV can be saved in Base64 to simplify the manipulation
// But it must be decoded to be used.
$key=base64_decode($keyb64);
$iv=base64_decode($ivb64);
// This is an PHP object, that can be easily converted to JSON
$json = new stdClass();
$json->generatedTime=$timestamp;
$json->agentId=$agentid;
$json->organizationId=$agentid;
$json->authGroupId=$agentid;
// identification of your system, useful for monitoring
$json->service="MySystem";
// The client's IP
$json->clientIP=$_SERVER['REMOTE_ADDR'];
// reverse lookups are used for some Machine Learning detection algorithms
// however, it can take some time. We recommend to send this information!
$json->clientReverse = ($reverse==1)? gethostbyaddr($json->clientIP) : "";
// This is the login name
$json->userName=$username;
// Used in some specific cases
$json->authMethod="";
// Put 0 if login was validated in the system and 1 if it failed
$json->loginFailed="0";
// This is the UserAgent provided by the browser
$json->userAgent=substr($_SERVER['HTTP_USER_AGENT'],0,500);
$json->psychometricTyped="";
$json->psychometricImage="";
// Create the JSON
$message = json_encode($json,JSON_UNESCAPED_SLASHES);
// PAD the message
$blocksize=16;
$padsize = $blocksize - (strlen($message) % $blocksize);
$message=str_pad($message,$padsize," ");
// Encrypt using the KEY/IV
$cipher = openssl_encrypt($message, 'aes-256-cfb8', $key, 0, $iv);
// Create the payload and send via UDP
$payload=$agentid."|".$cipher;
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_sendto($socket, $payload, strlen($payload), 0, "collector.guardiankey.net", "8888");
// OR create the payload and send via REST, using curl:
/* $tmpdata->id = $agentid;
$tmpdata->message = $cipher;
$data = json_encode($tmpdata)
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, 'https://api.guardiankey.io/checkaccess');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data)));
curl_setopt($ch,CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_REETURNTRANSFER, 1);
$return = curl_exec($ch);
curl_close($ch);
return $return;
*/
Evitando inundação de eventos
Quando um sistema recebe um ataque de força bruta, é comum que o mesmo envie para o GuardianKey muitos eventos. O GuardianKey conta com um avançado sistema de detecção de força bruta. Quando um ataque desse é detectado, o GuardianKey retorna “1” no campo “response_cache” do json de resposta do evento. Com isso, você pode por exemplo colocar o IP do atacante em uma “blacklist”, descartando e/ou bloqueando os acessos vindos desse IP.
Detalhes sobre a estrutura de dados JSON
A tabela abaixo descreve os campos JSON usados para enviar eventos para GuardianKey.
Field | Description |
---|---|
generatedTime | geração de evento em unix timestamp (ex. 1527075751) |
agentId | agentid para identificar exclusivamente o agente. Se você tiver apenas um agente, use o authGroupID |
organizationId | na maioria dos casos, use o mesmo authGroupId(ex. 7d97e98f8af…9e0ee507c4) |
authGroupId | string retornada pela função de registro (ex. 7d97e98f8af…9e0ee507c4) |
service | referência de texto para o seu sistema web, a sua escolha (ex. NextCloud) |
eventType | Tipo de evento (autenticação ou acesso incorreto (futuro)) |
clientIP | o IP (v4 ou v6) usado pelo usuário que está tentando acessar (por exemplo, 123.123.123.123) |
clientReverse | dns reverso do clientIP(ex. 123.123.123.123.ispdomain.com) |
userName | o nome de login do usuário usado no sistema (ex. john) |
userEmail | o e-mail do usuário (ex. [email protected]), necessário apenas se seus usuários devem ser notificados por acessos suspeitos |
loginFailed | 0 se usuário/senha corresponder e 1 caso contrário(ex. 0) |
userAgent | o cabeçalho completo do User-agent enviado pelo navegador do usuário (ex. “Mozilla/5.0 (Windows NT 6.1) … Safari/537.”) |
sequential | número seqüencial para evitar ataques de replay |
authMethod | usado para alguns serviços que permite que esses recursos, na maioria dos casos, deixem em branco |
psychometricTyped | em desenvolvimento, deixe em branco |
psychometricImage | em desenvolvimento, deixe em branco |
Recebendo notificações
Você tem dois modos para receber notificações: via e-mail ou Webhook.
Recebendo via e-mail
Se você deseja receber notificações por e-mail, basta configurar as informações do SMTP em sua conta no painel GuardianKey (https://panel.guardiankey.io).
Recebendo via webhook
Você pode receber notificações via webhook. Esse método permite que você personalize o tratamento da notificação: Envie para um banco de dados, notifique os usuários por outros métodos, etc.
Para isso, você precisa hospedar a página que recebe um json do GuardianKey e indicar no painel GuardianKey (ou no registrador) a URL do seu webhook. Por favor, veja a implementação de referência do webhook (em PHP):
https://github.com/guardiankey/guardiankey-api-php/blob/master/webhook.php
A tabela abaixo descreve os campos JSON enviados de GuardianKey para webhook:
Campo | Descrição |
---|---|
generatedTime | Data e hora em unixtime da geração do eventos (ex. 1527075751) |
message_contextual | Mensagem amigável sobre a notificação |
userName | Nome de usuário usado |
agentId | AgentID de serviço |
eventId | ID do evento |
risk_level | Nível de risco |
serviço | Nome do serviço |
clienteIP | IP utilizado no acesso |
asn | Sistema Autônomo Número de acessos |
clientReverse | DNS reverso do IP o acesso |
client_ua | Useragent de acesso |
client_device | Dispositivo do cliente |
client_os | Os usados |
país | País de acesso |
região | Região de acesso |
cidade | Cidade de acesso |
country_code | Código do país |
latitude | Posição de latitude do acesso |
longitude | Posição de longitude do acesso |
risk_value | Risco de Valor |
authMethod | Implementação futura |
event_response | Resposta de GuardianKey |
message_intel | Informação de inteligência de ameaça |
authGroupId | AuthgroupID do agente |
organizationId | ID da organização |
message_psychometric | Informação Psicométrica (futuro) |
Você pode também usar uma chave de criptografia simétrica para receber os eventos em seu webhook de forma criptogradfada. Para usar dessa forma crie o endpoint do seu webhook contendo a rota “/crypt”, e utilize as chaves “KEY e IV” do seu Authgroup como chave.
Criando sua própria tela de confirmação
Por padrão, o GuardianKey envia um link para a tela de confirmação (para o usuário ver se reconhece o acesso ou não) usando o domínio “guardiankey.io”. Você pode querer hospedagem desta tela em seu domínio (o que dá ao usuário mais credibilidade). Para isso você tem que seguir os seguintes passos:
- Você precisará de um servidor web (executando PHP, por exemplo) e, nesse servidor web, você configurará o webhook e a tela de confirmação. No endereço abaixo você encontrará os arquivos de referência (webhook.php e viewresolveevent.php). https://github.com/guardiankey/guardiankey-api-php
- Nas opções de arquivo “guardiankey.class.php”, você define a opção “resolveEventURL” como URL da sua tela para resolver eventos.
- Você configura sua ação do webhook para enviar ao usuário o link da sua tela de confirmação e no link a ser enviado ao usuário que você adicionar como parâmetros: eventId e event_token. Ex: https: //xxxxxxxxxx.com/viewresolveevent.php?e=<<\eventId>&t=<event_token>
- Finalmente, na tela de confirmação, você recuperará as informações do evento e enviará a resposta do usuário via API para GuardianKey, como no arquivo viewresolveevent.php.
Detalhes da criptografia
Utilizamos um algoritmo de criptografia simétrica para assinatura, autenticação e confidencialidade protegida dos eventos. Os sistemas devem enviar o authgroupID e o JSON criptografados no envio de eventos, como no exemplo abaixo (no caso do UDP):
authgroupID|cipher text (JSON)
Se usar a interface REST, o evento será enviado como JSON:
id: authgroupID
data: cipher text (JSON)
A tabela abaixo apresenta detalhes sobre a criptografia usada.
Parameter | Value |
---|---|
algoritmo de criptografia | AES |
comprimento da chave | 256 |
modo de cifra de bloco | CFB |
tamanho do segmento | 8 |
Referências úteis
- PHP API implementação de referência – https://github.com/guardiankey/guardiankey-api-php/
- Python API implementação de referência – https://github.com/guardiankey/guardiankey-api-python/
- Obtendo ajuda no grupo de discussão – https://groups.google.com/forum/#!forum/guardiankey
- Plugins já implementados
- Entre em contato com os desenvolvedores