domingo, 10 de março de 2013

Checklist de segurança Joomla!

Algumas dicas de segurança mais ou menos avulsas para Joomla.

A. Geral

  1. Aplicam-se as regras de segurança genéricas para o Apache, PHP e MySQL.

B. Instalação

  1. Não usar o prefixo de tabela MySQL "jos_".
  2. Definir as permissões do configuration.php para 444 (ou pelo menos 644).
  3. Em geral, os ficheiro PHP precisam de permissões 644 (preferencialmente 444) e as diretorias 755 (ou preferencialmente 555).
  4. De forma geral é boa ideia mover as diretorias /tmp, /log e todas as diretorias que precisem permissão de escrita (caches, imagens, uploads, etc) para FORA da diretoria pública (public_html), retirando-lhes portanto a possibilidade de acesso através de HTTP. No entanto isto pode causar problemas com a diretiva open_basedir do PHP e com algumas extensões.
  5. Não permitir o upload de scripts
  6. Renomear o ficheiro htaccess.txt para .htaccess e ligar o RewriteEngine.
  7. A adição destas linhas ao .htaccess bloqueia alguns exploits mais comuns:

########## Begin - Rewrite rules to block out some common exploits
#
# Block out any script trying to set a mosConfig value through the URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]
# Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
# Block out any script that includes a < script> tag in URL
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2}) [OR]
# Block out any script that tries to set CONFIG_EXT (com_extcal2 issue)
RewriteCond %{QUERY_STRING} CONFIG_EXT([|%20|%5B).*= [NC,OR]
# Block out any script that tries to set sbp or sb_authorname via URL (simpleboard)
RewriteCond %{QUERY_STRING} sbp(=|%20|%3D) [OR]
RewriteCond %{QUERY_STRING} sb_authorname(=|%20|%3D)
# Send all blocked request to homepage with 403 Forbidden error!
RewriteRule ^(.*)$ index.php [F,L]
#
########## End - Rewrite rules to block out some common exploits

C. Utilizadores e passwords

  1. Usar passwords não triviais.
  2. Criar uma conta de administrador com um username não trivial (ou seja, diferente de admin, administrator, root, etc). Promover esse utilizador a super-user e apagar a conta de admin. Além de ser um username conhecido, a conta de admin tem sempre o id 42 (homenagem ao Hitchhicker's Guide to The Galaxy), por isso é uma vulnerabilidade potencial (para Joomla anterior a 2.5.5).

D. Extensões

  1. Não instalar extensões desnecessárias.
  2. A extensão sh404SEF adiciona mais um nível de segurança e capacidades SEF (Search Engine Friendly). Esta extensão é vulnerável nas versões < 3.7.0.
  3. A extensão Admin Tools Core permite aplicar num único local várias das proteções aqui referidas.
  4. A extensão Akeeba Backup Core permite fazer backups completos de forma simples.
  5. Há outras extensões que melhoram a segurança (mas ver regra D.1).

E. Não fornecer informação gratuita

  1. Não publicitar o nome e versão do Joomla. Remover a meta tag "Generator".
  2. Não publicitar o nome e versão das extensões.

F. Ações periódicas

  1. Fazer backups regulares (por exemplo com o Akeeba Backup)
  2. Fazer regularmente uma "inspeção visual" e eliminar ficheiros suspeitos/desnecessários.
  3. Fazer testes de vulnerabilidades (com o nikto, joomscan, etc) e corrigir as vulnerabilidades detetadas.
  4. Manter-se atualizado sobre as novas vulnerabilidades descobertas consultando sites especializados (http://secunia.com/search/?search=joomla, http://www.frsirt.com/english, http://www.milw0rm.com/, por exemplo)

G. Atualizar

  1. Manter o Apache, PHP e MySQL atualizados.
  2. Manter o Joomla atualizado. A partir da versão 1.6 há a opção de o Joomla se autoatualizar (mas é necessário verificar a disponibilidade das extensões). Não usar Joomla 1.5 ou anterior.
  3. Manter as extensões atualizadas. Mesmo as extensões mais conhecidas e populares têm problemas de segurança.

Referências


Cliente GoogleDrive em Debian

O Google Drive já anda por aí há uns bons meses e a Google ainda não libertou o cliente para linux.
Há já varias alternativas não oficiais, algumas open source outras não.
A insync disponibiliza um cliente de sincronização para Google Drive em linux (muitas distribuições suportadas) que é gratuito em versão beta, mas que se vai tornar pago quando sair de beta. Enquanto está em beta e a Google não acaba o seu próprio cliente esta é a maneira de instala o insync.
Em Debian (ou Ubuntu ou Mint) basta importar a chave do repositório com:

wget -qO - https://d2t3ff60b2tol4.cloudfront.net/services@insynchq.com.gpg.key | sudo apt-key add -

Acrescentar um ficheiro /etc/apt/sources.list.s/insync.list, com a linha:

deb http://apt.insynchq.com/[DISTRIBUTION] [CODENAME] non-free

Em que [DISTRIBUTION] é o nome da distribuição e [CODENAME] é o nome da versão. Por exemplo, para Debian 6 (squeeze) fica:

deb http://apt.insynchq.com/debian squeeze non-free

Atualizar os repositórios:

apt-get update

Há pacotes diferentes para cada interface gráfico. Instalar com

apt-get install insync-beta-[INTERFACE]

Para debian com Gnome fica:

apt-get install insync-beta-gnome

[INTERFACE] pode ser: ubuntu, cinnamon, gnome, kde, mate, xfce
O pacote kde suporta KDE 4.
O pacote gnome, aparentemente, só suporta Gnome 3, porque não consegui instalar em Squeeze.


Referência:
https://www.insynchq.com/linux

domingo, 3 de fevereiro de 2013

Proteger o acesso a uma página web do Apache com .htaccess

O ficheiro .htaccess permite modificar o comportamento do servidor web Apache de várias formas. Uma dessas formas é a definição de uma password que tem de ser digitada para poder aceder à página.
Este método envolve a criação de dois ficheiros: .htpasswd (que vai conter a password) e .htaccess (que contém as instruções para o Apache pedir a password). É necessário também ter acesso à linha de comandos do servidor (acesso físico ou por SSH).

.htpasswd

Criamos o ficheiro .htpasswd com o seguinte conteúdo:
myuser:X4r!23dF
Em que "myuser" é o nome de utilizador e o "X4r!23dF" é a password. O ":" é o separador entre o username e a password.
O .htpassword, por uma questão de segurança, deve ser criado numa pasta não acessível a partir da web.
O ficheiro .htpasswd tem de ser encriptado para poder ser utilizado. A encriptação é feita usando o utilitário htpasswd. Portanto executamos:
htpasswd -c .htpasswd myuser
O parâmetro -c indica que queremos criar um novo ficheiro encriptado. O "myuser" é o username que queremos usar. É nos pedida a password (duas vezes).
Se tentarmos ver o conteúdo do .htpasswd com:
cat .htpasswd
Verificamos que o nome de utilizador continua visível, mas a password está encriptada.

.htaccess

Vamos agora criar o ficheiro .htaccess. Ao contrário do .htpasswd, este deve ser criado na pasta web que pretendemos proteger.
O .htaccess deve ficar com este conteúdo:

AuthUserFile /caminho/completo/.htpasswdAuthType BasicAuthName "Documento protegido"Require valid-user

Erro comum

Se as diretivas no ficheiro .htacces aparentam não estar a funcionar, a causa mais provável é a existência da diretiva
AllowOverride none
na configuração da pasta no Apache. Com esta opção o ficheiro .htaccess é completamente ignorado pelo Apache. Apenas é necessário editar a linha para
AllowOverride all
para permitir todas as diretivas no .htaccess, ou então
AllowOverride AuthConfig
para autorizar apenas as oções relativas à autrnticação.
Depois de alterar a configuração do Apache é necessário reiniciá-lo com
/etc/init.d/apache2 restart
ou com um comando equivalente.

Referências


http://www.elated.com/articles/password-protecting-your-pages-with-htaccess/
http://httpd.apache.org/docs/2.0/mod/core.html#allowoverride

sexta-feira, 19 de outubro de 2012

Repositórios Debian

Alguns repositórios Debian

Aqui fica uma lista de alguns repositórios Debian bem jeitosos. O sources.list fica apenas com os repositórios oficiais Debian. Os outros repositórios ficam cada um no seu ficheiro .list na diretoria sources.list.d, para ser mais fácil gerir.

 

sources.list


deb http://ftp.pt.debian.org/debian/ squeeze main contrib non-free

deb-src http://ftp.pt.debian.org/debian/ squeeze main contrib non-free

deb http://security.debian.org/ squeeze/updates main contrib non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free

# squeeze-updates, previously known as 'volatile'
deb http://ftp.pt.debian.org/debian/ squeeze-updates main contrib non-free
deb-src http://ftp.pt.debian.org/debian/ squeeze-updates main contrib non-free

sources.list.d/dropbox.list


# dropbox
# apt-key adv --keyserver pgp.mit.edu --recv-keys 5044912E
deb http://linux.dropbox.com/debian squeeze main

sources.list.d/google.list


##########################
# Google APT Repositories #
##########################
# wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
# Google Chrome repo http://www.google.com/linuxrepositories/
deb http://dl.google.com/linux/chrome/deb/ stable main
# Google Talk browser plugin http://www.google.com/chat/video
# deb http://dl.google.com/linux/talkplugin/deb/ stable main
# Google Earth
# deb http://dl.google.com/linux/earth/deb/ stable main
# Google's Music Manager
# http://www.google.com/support/music/bin/answer.py?answer=1229970
# deb http://dl.google.com/linux/musicmanager/deb/ stable main

sources.list.d/mozilla.list


# mozilla
# http://mozilla.debian.net
# iceweasel, icedove, iceape
# apt-get install pkg-mozilla-archive-keyring
# deb http://mozilla.debian.net/ squeeze main
# firefox, thunderbird
# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com C1289A29
deb http://downloads.sourceforge.net/project/ubuntuzilla/mozilla/apt all main
# os pacotes são firefox-mozilla-build, thunderbird-mozilla-build, seamonkey-mozilla-build

sources.list.d/multimedia.list


# deb multimedia
# http://deb-multimedia.org
# apt-get update
# apt-get install deb-multimedia-keyring
deb http://deb-multimedia.org squeeze main non-free
# deb http://deb-multimedia.org squeeze-backports main

sources.list.d/playonlinux.list


# play-on-linux
# wget -q "http://deb.playonlinux.com/public.gpg" -O- | apt-key add -
deb http://deb.playonlinux.com/ squeeze main

sources.list.d/virtualbox.list


# virtualbox
# wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -
deb http://download.virtualbox.org/virtualbox/debian squeeze contrib non-free

sources.list.d/scribus.list


# scribus
# apt-key adv --recv-keys --keyserver subkeys.pgp.net EEF818CF
deb http://debian.scribus.net/debian stable main
deb-src http://debian.scribus.net/debian stable main

Referências

https://sites.google.com/site/mydebiansourceslist/

quinta-feira, 23 de agosto de 2012

logwatch, fail2ban, molly-guard

Mais umas excelentes ferramentas para sistemas linux

logwatch


Instala-se com o habitual

apt-get install logwatch

E já está.
A instalação cria um script em /etc/cron.daily que se encarrega de correr o logwatch e enviar um email para o root.

Para modificar as opções pré-definidas é preciso copiar o ficheiro de configuração de exemplo para /etc/logwatch/conf:


cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/

E editar o ficheiro. No Debian a opção TmpDir estava mal configurada, deve ser mudada para /tmp.
Todas as opções podem ser sobrepostas através de parâmetros na linha de comandos.

O logwatch apenas cria o relatório com os eventos mais significativos do sistema, é responsabilidade do administrador ler o relatório e agir em conformidade.

fail2ban

apt-get install fail2ban

E já está.
A configuração básica está em /etc/fail2ban/fail2ban.conf e a configuração mais específica em /etc/fail2ban/jail.conf.

Apenas a proteção das ligações SSH está pré-definida, para outros protocolos/aplicações é preciso editar o /etc/fail2ban/jail.conf.

molly-guard

apt-get install molly-guard

E já está.
O molly-guard pede o nome da máquina quando tentamos desligar uma máquina através de SSH.

Algumas coisas básicas a fazer numa máquina nova

Um pequeno conjunto de aplicações e configurações a executar em máquinas novas (linux claro, Debian de preferência)

Rede


Primeiro que tudo é sempre preciso configurar corretamente a rede.
Se a interface de rede é configurada por DHCP não há muito a fazer, mas se queremos um IP estático é preciso editar o /etc/network/interfaces e substituir o dhcp por static na interface pretendida e indicar, pelo menos o endereço, netmask e gateway, qualquer coisa assim:


auto eth0
iface eth0 inet static
        address 192.168.1.31
        netmask 255.255.255.0
        gateway 192.168.1.254

Mas nem só de IP vive a rede. Também é importante definir os servidores de DNS, o hostname e o domain name. Mais uma vez o DHCP trata disto, mas se quisermos um IP estático temos de editar /etc/resolv.conf, /etc/hostname e /etc/hosts.

É preciso escolher um hostname, que identifica a máquina e um nome de domínio, que identifica a rede local. Vamos usar server001 e lan, respetivamente.

Em /etc/resolv.conf colocamos o nome de domínio e os servidores de DNS. DNS é um serviço crítico, por isso normalmente são definidos pelo menos dois. O ficheiro pode ficar com este conteúdo:

domain lan
search lan
nameserver 208.67.220.220
nameserver 208.67.222.222

Neste caso o domínio chama-se lan (é o pré-definido) e dizemos que queremos pesquisar o domínio lan. As duas entradas nameserver são os dois servidores DNS a usar. Os IPs indicados são do serviço OpenDNS e podem ser usados livremente. Por vezes há uma única entrada nameserver que corresponde ao gateway da rede, é usual em sistemas configurados por DHCP.

Em /etc/hostname colocamos o hostname (basicamente o nome da máquina), assim:

server001

No ficheiro hosts convém colocar uma entrada para o hostname definido antes, qualquer coisa como:

127.0.0.1 localhost
127.0.0.1 server001 server001.lan

Para que tudo funcione é preciso reiniciar os serviços respetivos:

/etc/init.d/networking restart
/etc/init.d/hostname start

Tempo


Parecendo que não, é bastante importante que o relógio e o fuso horário do sistema estejam certos, principalmente se vamos usar coisas como servidores de mail, serviços de autenticação  e até para os logs do sistema.
Para configurar o fuso horário:

dpkg-reconfigure tzdata

Para acertar a hora o melhor é deixar que o sistema se atualize automaticamente, é para isso que existe o serviço NTP. Basta fazer:

apt-get install ntp

E esperar um pouco enquanto o sistema sincroniza.
Podemos ver o estado do NTP com:

ntpq -p

Para ver a data e hora atual fazer:

date

Quando a hora estiver certa convém atualizar o relógio de hardware, para poder manter a hora certa (pelo menos com pequenas variações) mesmo enquanto o sistema está desligado. Para atualizar o relógio de hardware fazemos:

hwclock --systohc

Locale

Chama-se locale ao conjunto de definições que informam o sistema a língua a utilizar e os formatos para apresentação de datas, horas, valores monetários, etc.
É importante definir corretamente o locale que pretendemos usar, pois se não o fizermos arriscamo-nos a receber mensagens numa língua que não entendemos.
Para escolher os locales a gerar fazemos:

dpkg-reconfigure locales

Os locales selecionados serão criados. Pode demorar alguns segundos (ou minutos) a gerar cada locale.
O comando locale mostra as variáveis definidas.
Se alguma estiver em branco pode ser necessário defini-la manualmente com, por exemplo:

export LC_TIME=en_US.UTF-8

Ainda não consegui descobrir porque é que o dpkg-reconfigure locales nem sempre define todas as variáveis LC_* e LANG*.

Um script útil em servidores (principalmente os que têm pouco espaço em disco) é o localepurge. É só instalar com:

apt-get install localepurge

É preciso selecionar os locales a MANTER, todos os outros serão apagados.
Da próxima vez que se fizer uma instalação com o apt-get, ou se correr manualmente o localepurge, serão apagados os locales que não foram selecionados. Este script não é 'oficial' e pode causar alguns erros (inofensivos). Usar com precaução e RTFM.

rkhunter

Um caçador de rootkits para linux e BSD

Para instalar o rkhunter pode fazer-se o download a partir do site oficial e correr o script de instalação, mas como de costume prefiro os repositórios Debian:

apt-get install rkhunter

Ou para quem prefere otimizar o código (e tiver o apt-build instalado):

apt-build install rkhunter

Para correr manualmente, convém fazer uma atualização e só depois fazer a verificação:

rkhunter --update
rkhunter --check

Também podemos correr o comando:

rkhunter --propupd

Que cria uma base de dados com as propriedades dos ficheiros executáveis presentes no sistema. Das próximas vezes que o rkhunter for executado (SEM a opção --propupd) compara os ficheiros com a informação guardada e avisa se ocorreu alguma alteração. É claro que:

  1. É da responsabilidade do utilizador assegurar que todos os executáveis são legítimos quando se executa o --propupd;
  2. O rkhunter apenas avisa se ocorrer alguma alteração dos ficheiros, não tem forma de saber se essa alteração é fidedigna ou não (por exemplo, um apt-get upgrade altera as propriedades dos ficheiros).

O rkhunter costuma gerar alguns avisos 'falsos positivos', mas devem ser investigados, porque às vezes um verdadeiro positivo está escondido atrás de um falso.

A instalação do rkhunter cria os scripts /etc/cron.daily/rkhunter e /etc/cron.weekly/rkhunter que se encarregam de correr o rkhunter diariamente e de o atualizar semanalmente.
Os ficheiros /etc/default/rkhunter e /etc/rkhunter.conf têm as configurações a usar, mas as que estão pré-definidas são normalmente suficientes.

Referências

http://rkhunter.sourceforge.net/