Arquivo mensais:agosto 2015

Segurança: SSH – Verificação em duas etapas

A verificação em duas etapas (two-factors) é a tecnologia que nos permite adicionar uma camada de segurança no processo de autenticação convencional (usuário e senha).
É recomendável usar sempre que é possível, mas e o SSH, tem alguma coisa voltada para isso? Não sei, mas podemos criar algo nós mesmos para isso.

O Linux nos dá o poder de fazer as configurações necessárias.

Então vamos a ela.

Primeiro passo você precisa alterar o bash do seu usuário, os comandos a seguir precisam ser executados como root.

Edite o arquivo “/etc/passwd”, quando encontrar seu usuário, altere o bash dele

exemplo:

leandro:x:1000:1000:Leandro Henrique:/home/leandro:/bin/bash
altere para:
leandro:x:1000:1000:Leandro Henrique:/home/leandro:/usr/local/token

Feito isso hora de criar nosso arquivo “/usr/local/token” para fazer a segunda verificação

exemplo:


#!/bin/bash
echo -e "\nControl + c acionado.\n"
control_c () {
#pkill -kill -u $USUARIO
exit 0;
}

trap control_c INT HUP TERM

USUARIO=`whoami`;
#Aqui você coloca uma URL para enviar para você um SMS,
#ou um email.
#Claro se for SMS você precisa de ter um gateway que faça isso
#existem outros meios, mas este artigo não tem objetivo de
#explorar isso.
VALID_TOKEN=`curl http://asterisk.reis/api/sms/sendtoken/6`

echo "Please enter the token:"
read TOKEN;

if [ "$TOKEN" == "$VALID_TOKEN" ]; then
echo "You have access!"
/bin/bash
exit;
fi

echo "ACCESS DENIED!"
#pkill -kill -u $USUARIO
exit;

O que o código a cima faz?
Primeiro e disse que o script vai ser executado pelo bash.
Cria uma função para prevenir que caso o usuário pressione ctrl+c, ao invés de cancelar o script e ir para o prompt de comando, saia do bash e finalize a conexão SSH, ou caso prefira, pode remover o comentário da linha “#pkill -kill -u $USUARIO” e todas as sessões com este usuário serão fechadas (meio brusco, mas fica a critério de cada um), tem suas vantagens e desvantagens vale a você analisar o que é melhor para você.

Depois ele pega gera um token usando um serviço externo que este artigo não contempla, cabe a você desenvolver ou utilizar algo pronto por ai para enviar um SMS ou email para você.

Em seguida ele solicita ao usuário que digita o valor do token, que foi enviado por SMS ou EMAIL ou qualquer meio que você utilizar.
Então verifica se os tokens batem, se batem ok! Ele passa, senão sai do bash, finaliza.

Bom temos dois problemas ai, primeiro é que seu gateway pode falhar, segundo que você pode ter acesso ao terminal fisicamente e ficaria incomodo você com acesso físico ter que esperar sempre receber o token para poder acessar sua máquina toda vez que abrir um terminal.

Então vamos a um script que verifica se ouve erro, vamos considerar que o token seja apenas de 6 caracteres se o CURL devolver algo maior que isso é porque deu algum erro.

O código completo de como fica está abaixo, e no vídeo mais detalhes da utilização desse processo.


#!/bin/bash
control_c () {
echo -e "\nControl + c acionado.\n"
#pkill -kill -u $USUARIO
exit 0;
}

trap control_c INT HUP TERM

if [[ $(who am i) =~ \((\:0\))$ ]]; then
/bin/bash
exit;
fi

USUARIO=`whoami`;
SECRET="123123";

VALID_TOKEN="15";
#VALID_TOKEN=`curl http://asterisk.reis/api/sms/sendtoken/6`

TAMANHO=${#VALID_TOKEN};
NO_TOKEN="-";

if [[ "$VALID_TOKEN" == "$NO_TOKEN" || "$TAMANHO" -gt 6 ]]; then
echo "Failed to send the token";
stty -echo;
VALID_TOKEN=$SECRET;
fi

echo "Please enter the token:"
read TOKEN;
stty echo;

if [ "$TOKEN" == "secret" ]; then
VALID_TOKEN=$SECRET;
echo "Please enter the password:"
stty -echo;
read TOKEN;
stty echo;
fi

if [ "$TOKEN" == "$VALID_TOKEN" ]; then
echo "You have access!"
/bin/bash
exit;
fi

echo "ACCESS DENIED!"
#pkill -kill -u $USUARIO
exit;

Bom temos ai um script que caso falhe a geração do tem, ou você não queira muito esperar possa digitar “secret” e depois digitar sua segunda senha secreta.

Assista o vídeo para mais detalhes de utilização e como funciona, caso não tenha compreendido.

Laravel: Validation->Como validar pelo form request uma array de dados

Você já deparou com a necessidade de validar uma array de informações?

Imagina o cenário:

Cliente tem várias referências comerciais, e você precisa validar cada uma, mas também estas referências não são obrigatórias.

Considerando que você está usando o formrequest, vou deixar um exemplo aqui, para o método rules():


public function rules()
{
    $input = parent::all();

    /*
    * verifica se referencias foi enviado
    * caso contrário não valida nada
    * ou
    * você pode definir a obrigatoriedade colocando
    * return ['referencias' => 'required'];
    */
    if (!isset($input['referencias'])) {
        return [];
    }

    /*
    * verifica se referencias é uma array
    * caso contrário pedi para enviar como array
    */
    if (!is_array($input['referencias'])) {
        return ['referencias' => 'array'];
    }

    /*
    * pega as rules padrão
    * @var array
    */
    $rules = [
        'nome' => 'required|min:2|max:30',
        'telefone' => 'required|integer|min:10|max:11'
    ]

    /*
    * pega as referências comerciais informadas
    * @var array
    */
    $referencias = $input['referencias'];

    /*
    * varre a array de referências e verifica se todos os campos
    * de "rules" foram informados
    * @var array
    */
    $newRules = array();
    foreach ($referencias as $keyRefe => $referencia) {
        /*
        * se for informado um id
        * verifica se ele existe na tabela de referências comerciais
        */
        if (isset($referencia['id'])) {
            $newRules['referencias.'.$keyRefe.'.id'] = 'exists:referencias_comerciais,id';
            continue;
        }

        /*
        * varre rules para verificar as keys e
        * o tipo de validação configurada, e adiciona nas novas rules
        * @var array
        */
        foreach ($rules as $key => $value) {
            $newRules['referencias.'.$keyRefe.'.'.$key] = $value;
        }
    }

    return $newRules;
}