Mostrar mensagens com a etiqueta Webserver. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Webserver. Mostrar todas as mensagens

quinta-feira, 31 de maio de 2018

Regras iptables - webserver SYN flood

Algumas regras para o iptables proteger um webserver contra alguns ataques. Por exemplo, o ataque SYN flood [0].

Descartar os pacotes SYN que não são recebidos:
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

Descartar pacotes com fragmentos:
iptables -A INPUT -f -j DROP

Descartar pacotes mal criados XMAS:
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

Descartar pacotes nulos:
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

Bloquear um IP externo de aceder ao servidor:
iptables -A INPUT -s IP-ADDRESS -j DROP

Bloquear um IP externo de aceder a uma porta do servidor:
iptables -A INPUT -s IP-ADDRESS -p tcp --destination-port 80 -j DROP


[0] - https://en.wikipedia.org/wiki/SYN_flood

[1] - https://www.cyberciti.biz/tips/linux-iptables-10-how-to-block-common-attack.html

[2] - https://www.cyberciti.biz/faq/how-do-i-block-an-ip-on-my-linux-server/

quinta-feira, 21 de julho de 2016

COPS | Disponibilização web de uma biblioteca do Calibre

Com a crescente digitalização dos mais diversos livros e consequente disponibilização gratuita de muitas obras no domínio público, torna-se interessante a possibilidade de ter um acesso prático e fácil a um acervo digital deste tipo.

O software Calibre [1] permite gerir uma biblioteca digital de forma muito fácil, fornecendo mecanismos rápidos para a organização e catalogação da mesma. Aceita diversos tipos de ficheiros incluindo os mais que comuns EPUB e PDF.
Resta acrescentar que é um projeto open source e que está disponível para "todos" os sistemas operativos.

O Calibre possui um diretório de trabalho onde fica registada toda a informação referente à Biblioteca Digital.

O projeto COPS [2] foi desenvolvido pelo Sébastien Lucas e permite fazer com que um servidor web com PHP possa disponibilizar de forma rápida e acessível a biblioteca digital criada pelo Calibre.

0. Pré-Requisitos

A instalação será feita num servidor ubuntu 16.04 LTS com apache2 e php com algumas extensões instaladas.

apt-get install apache2 php php-gd php-sqlite3 php-json php-intl php-xml

Deverá ser feita a criação de uma biblioteca digital com o Calibre e ter acesso à mesma.

1. Instalação do COPS

Deve obter-se o ZIP com o código do COPS disponível aqui cops-1.0.0.zip e extrair-se na pasta do webserver.

cd /var/www/html
wget https://github.com/seblucas/cops/releases/download/1.0.0/cops-1.0.0.zip
unzip cops-1.0.0.zip

Para facilitar pode renomear-se o diretório:
mv cops-1.0.0 cops

A partir de agora é possível aceder a:
http://servidor/cops

2. Configuração do COPS

Deve abrir-se o ficheiro de configuração config_default.php e alterar o necessário, com especial atenção:
  • $config['calibre_directory'] = 'ebooks/'; // deve ter o caminho para os ficheiros, neste caso ebooks.
  • $config['cops_full_url'] = 'http://servidor/cops'; // deve ter o endereço completo do servidor COPS
  • $config['cops_title_default'] = "Biblioteca Digital"; // nome que é apresentado na biblioteca digital
  • $config['cops_language'] = 'pt_PT'; // para ficar com a interface em Português

3. Disponibilização da Biblioteca

Falta apenas enviar a biblioteca digital criada pelo Calibre para o servidor, que pode ser feita recorrendo a diversos métodos (FTP, SFTP, rsync, etc), tendo o cuidado de deixar todos os ficheiros no diretório ebooks (configurado anteriormente).

A partir deste momento toda Biblioteca Digital estará disponível num browser à distâncias de uns cliques:
http://servidor/cops

Referências

[1] - https://calibre-ebook.com/
[2] - http://blog.slucas.fr/en/oss/calibre-opds-php-server

terça-feira, 8 de março de 2016

Reverse Proxy com o nginx

A utilização de um reverse proxy permite que um servidor acessível a partir da Internet forneça serviços existentes na sua rede privada para a Internet.
Desta forma, basta uma única máquina com este serviço para depois permitir o acesso a, por exemplo, vários serviços web existentes na rede privada.

Requisitos

O serviço de reverse proxy será feito com recurso ao nginx num servidor ubuntu 14.04.

Servidores internos a disponibilizar na internet:

  • 192.168.1.11:80 - servidor web principal
  • 192.168.1.12:80 - servidor web de teste

Instalação do nginx

apt-get install nginx

Após isto o serviço HTTP fica disponível e acessível na porta 80
netstat -tap
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:http                  *:*                     LISTEN      8967/nginx      

Os ficheiros de configuração de cada site ficam disponíveis em: /etc/nginx/sites-available
Por defeito existe apenas o default que permite ver a página por defeito do nginx.

Configuração do reverse proxy

Como o reverse proxy não vai disponibilizar serviço web direto, a configuração default que pode ser removida:
rm /etc/nginx/sites-enabled/default

Após qualquer alteração deste género é necessário fazer o reload das configurações do servidor:
service nginx reload

Neste caso, após ser removido o site default, passará a ser dado um aviso que a página não está disponível.

Resta agora criar um ficheiro de configuração para cada servidor:
nano /etc/nginx/sites-avaiable/www
server {
    listen 80;
    server_name www.exemplo.org exemplo.org;

    location / {
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       proxy_set_header Host $host;
       proxy_pass http://192.168.1.11;
    }
}

nano /etc/nginx/sites-avaiable/test
server {
    listen 80;
    server_name test.exemplo.org;

    location / {
       proxy_set_header X-Real-IP  $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       proxy_set_header Host $host;
       proxy_pass https://192.168.1.12;
    }
}

Resta agora ativar os sites, para tal é necessário criar um link simbólico de cada um dos ficheiros para o diretório sites-enabled:
ln -s /etc/nginx/sites-available/www /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled/

E reiniciar o serviço
service nginx reload

Após isto caso o DNS esteja a apontar para o servidor correto e a porta 80 do router encaminhe tudo para o novo servidor, será possível aceder a cada um dos servidores pelo seu nome de domínio.

Esta configuração pode ser escalável para muitos mais serviços de forma semelhante.

Referências

[1] - Documentação Oficial: https://www.nginx.com/resources/admin-guide/reverse-proxy/
[2] - Exemplo: https://www.garron.me/en/linux/nginx-reverse-proxy.html

terça-feira, 8 de dezembro de 2015

Servidor HTTPS gratuito e confiável - Let's Encrypt

O projeto Let's Enrypt [1] juntou grandes empresas da rede na criação de uma entidade de certificação gratuita, automática e aberta. Permitindo assim que todos os websites possam ter certificados válidos para encriptação do tráfego que geram.

Para perceber melhor o conceito, pode dizer-se que toda a navegação feita em endereços URL que utilizam apenas http:// é aberta e pode ser facilmente acedida por qualquer "pessoa" na rede.
Quando se utilizam endereços URL que começam por https:// significa que existe uma negociação automática entre o servidor e o nosso browser, que lhes permite comunicar de uma forma que toda a informação que passa na rede está encriptada e ao ser apanhada não é perceptível o que lá está.

Para que se possa confiar no servidor, há muitos anos criou-se um esquema de empresas de certificação que se responsabilizam pela validade da identidade do servidor e pela segurança e fiabilidade das chaves utilizadas. Este processo envolvia quase sempre o pagamento dos certificados.

Sempre foi possível a criação de certificados manuais, que cada administrador criava para os seus servidores, contudo como eram manuais e não havia nenhuma entidade externa a validá-los, quase todos os browsers exibem avisos que o site é potencialmente perigoso e afins. Tornando-se assim uma solução pouco aceitável para uma utilização generalizada pois, apesar de as comunicações serem muito mais seguras, os utilizadores eram alertados para os perigos de segurança do certificado não ser reconhecido...

Com o projeto Let's Encrypt, grandes empresas como a Mozilla, Cisco, Akamai, Facebook, entre muitas outras, decidiram tornar o processo de criação e atribuição de certificados para servidores muito mais rápido, fácil e económico, permitindo assim que a proteção de todas as comunicações feitas online esteja ao alcance de todos.

Instalação do cliente

Para obter e instalar o software cliente do Let's Encrypt, a forma mais rápida é através do git:
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

Para instalar:
./letsencrypt-auto

Na documentação do projeto há imensas referências que permitem cobrir grande parte das configurações básicas [2], designados de plugins e que estão muito bem documentados.

Criação de um certificado manual

No meu caso particular tenho o tráfego HTTP (porta 80) a ir para um servidor e o HTTPS (porta 443) a ir para outro servidor. Assim, não é possível utilizar os plugins disponibilizados pelo cliente, pois este pressupõe que ambos os serviços são assegurados pela mesma máquina.

Desta forma foi instalado o cliente Let's Encrypt no servidor para HTTPS e executado como root:
./letsencrypt-auto certonly --manual

De seguida é necessário indicar o domínio alvo do certificado, podendo ser incluídos diversos domínios separados por vírgulas ou espaço, por exemplo: dominio.my.to

Depois é indicado que o nosso IP público será registado e associado ao pedido de certificado.

E são depois apresentadas algumas informações que deverão ser seguidas:
Make sure your web server displays the following content at
http://dominio.my.to/.well-known/acme-challenge/coJuntoDeL3trasENumerosMUUIIIITOOOgrande before continuing:

coJuntoDeL3trasENumerosMUUIIIITOOOgrande-876kjjhasd982134

E fica à espera que seja feito o setup necessário, após o qual devemos dar enter.

Como se pode observar pelas indicações dadas, o serviço do Let's Encrypt vai tentar aceder a um ficheiro em HTTP no mesmo domínio, assim é necessário criar as pastas necessários no servidor HTTP e criar o ficheiro indicado com o conteúdo pretendido:
mkdir -p /var/www/html/.well-known/acme-challenge
printf "%s" coJuntoDeL3trasENumerosMUUIIIITOOOgrande-876kjjhasd982134 > /var/www/html/.well-known/acme-challenge/coJuntoDeL3trasENumerosMUUIIIITOOOgrande

Para testar deve abrir-se o browser o endereço http://dominio.my.to/.well-known/acme-challenge/coJuntoDeL3trasENumerosMUUIIIITOOOgrande e verificar se aparece o texto pretendido:
coJuntoDeL3trasENumerosMUUIIIITOOOgrande-876kjjhasd982134

Quando isto estiver pronto, resta voltar ao cliente do Let's Encrypt e finalizar com enter e, caso tudo corra bem, aparecerá a seguinte informação:
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/dominio.my.to/fullchain.pem. Your cert will
   expire on 2016-03-07. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Configuração do apache para o certificado Let's Encrypt

Agora que existe um certificado válido, resta alterar a configuração do apache para que utilize este novo certificado.
Os certificados estão disponíveis em /etc/letsencrypt/live/dominio.my.to/ e explicados na documentação [3].

No ficheiro de configuração do HTTPS no apache, por exemplo, /etc/apache2/sites-available/default-ssl.conf, deverão ser refletidos os novos certificados:
####Configuration for SSL #####
SSLEngine on
# LET'S ENCRYPT
SSLCertificateFile /etc/letsencrypt/live/dominio.my.to/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/dominio.my.to/privkey.pem
#### End of SSL Configuration ####

De seguida resta reiniciar o apache e começar a utilizar o novo certificado válido
service apache2 restart

Ao aceder ao serviço HTTPS no browser já será apresentado como seguro sem as mensagens normais que o certificado não é válido.



[1] - https://letsencrypt.org/
[2] - https://letsencrypt.readthedocs.org/en/latest/using.html#installation
[3] - https://letsencrypt.readthedocs.org/en/latest/using.html#where-are-my-certificates

domingo, 17 de fevereiro de 2013

Raspberry Pi - Controlar GPIO em PHP

Para controlar o GPIO do Raspberry Pi através do PHP é necessário efetuar algumas configurações.

1. Configuração da execução do gpio

Adicionar no final do ficheiro de sudoers para dar permissão a www-data de execução apenas do comando gpio.
$ whereis gpio
gpio: /usr/local/bin/gpio
$ sudo visudo
...
# GPIO
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/gpio


Em PHP depois é possível fazer a chamadas à ferramenta gpio com sudo.

2. Exemplo de ficheiro PHP para controlar LED

Seguindo o setup eletrónico feito aqui, é possível criar o ficheiro led.php que acende e apaga o led através do PHP.

Exemplo led.php:

if (isset($_GET['led'])&&$_GET['led']!=''){
  exec("sudo gpio -g mode 7 out"); // Iniciar o GPIO07 = pino 26
  if ($_GET['led']=='on'){
    exec("sudo gpio -g write 7 1"); // Acender LED
  }else{
    exec("sudo gpio -g write 7 0"); // Apagar LED
  }
}

Para verificar basta ter uma hiperligação ou inserir o URL que passe a variável led com o valor on para acender o LED e qualquer outro para o apagar.

Para acender:
http://rpi/led.php?led=on

Para apagar:
http://rpi/led.php?led=off

Raspberry Pi - webserver

A instalação de um webserver no Raspberry Pi permitirá ter um webserver com muito baixo consumo energético.
Mais para a frente será pretendido ter o webserver a controlar o Raspberry Pi através de PHP.

Normalmente utiliza-se o apache2 como webserver e o mysql-server para base de dados, mas devido às limitações do Raspberry Pi, a utilização do lighttpd webserver deverá ser mais adequada.

Também o mysql-server revela-se muito voraz em RAM... Após a sua instalação a RAM livre passou de 210MB para apenas 96MB...

Assim, ainda se procuram alternativas... 

1. Instalar lighttpd + php5

Para fazer este setup basta:
$ sudo apt-get install lighttpd php5-cgi

2. Configurar o webserver

A configuração básica necessária implica apenas ativar e configurar o suporte para PHP.

Para ativar o suporte para PHP no lighttpd:
$ sudo lighty-enable-mod fastcgi-php

Depois é necessário localizar o binário do php5-cgi para indicar na configuração do lighttpd:
$ whereis php5-cgi
php5-cgi: /usr/bin/php5-cgi ... ...

$ sudo nano /etc/lighttpd/conf-enabled/15-fastcgi-php.conf 

Confirmar se a o binário está correto:
"bin-path" => "/usr/bin/php5-cgi",

Caso esteja tudo correto, carregar as definições:
$ sudo service lighttpd force-reload

3. Testar o funcionamento

Depois de instalado e configurado resta testar. Para tal basta criar um ficheiro .php, por exemplo:
$ sudo nano /var/www/info.php
<?php
phpinfo();
?>

Abrir um browser e introduzir http://a.b.c.d/info.php
Onde a.b.c.d é o IP do Raspberry Pi.