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/
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
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.
[2] - http://blog.slucas.fr/en/oss/calibre-opds-php-server
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.
Servidores internos a disponibilizar na internet:
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.
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.
[2] - Exemplo: https://www.garron.me/en/linux/nginx-reverse-proxy.html
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 nginxApó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;
}
}
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.
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.
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
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
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
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 ####
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.
$ whereis gpio
gpio: /usr/local/bin/gpio
$ sudo visudo
...
# GPIO
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/gpio
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
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
}
}
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...
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();
phpinfo();
?>
Abrir um browser e introduzir http://a.b.c.d/info.php
Onde a.b.c.d é o IP do Raspberry Pi.
Subscrever:
Mensagens (Atom)
