Using Let’s Encrypt with getssl and minimal root usage #letsencrypt

Let's Encrypt is an amazing initiative to have X.509 certificates for your website, or even your email servers, but most instructions just tell you to run (some more some less) complicated programs as root in order to run the periodic certificate renewal workflows, and that is sub-optimal as it substantially increases the number of attack vectors your already exposed system is susceptible to.

This article is just a way to enjoy the benefits of Let’s Encrypt while minimizing the need for root privileges in your system,and thus keeping it reasonably secure, and this example is doing it with getssl (don’t be scared it hasn’t changed much for some time, they’re working on the new APIv2 support).

It’s taking in account a typical CentOS/Red Hat 7 server, your mileage might vary with other systems but it should mostly be the same.

You can start setting up your environment by adding a non privileged user, let’s say… acme… who will run the renewal workflow:

# useradd acme

Then you can proceed to installing getssl and setting up directories for your files:

# curl https://raw.githubusercontent.com/srvrco/getssl/master/getssl > /usr/local/bin/getssl
# chmod 0755 /usr/local/bin/getssl
# mkdir -p /etc/letsencrypt/acme/ssl.{crt,key,pem}
# chown -R acme:acme /etc/letsencrypt/acme
# chmod -R 0755 /etc/letsencrypt
# chmod 0750 /etc/letsencrypt/acme/ssl.{key,pem}
# mkdir -p /var/www/html/letsencrypt/.well-known/acme-challenge
# chown letsencrypt:letsencrypt /var/www/html/letsencrypt/.well-known/acme-challenge
# echo 'letsencrypt yourhostname=NOPASSWD: /usr/bin/systemctl restart httpd' >> /etc/sudoers.d/letsencrypt

That last line adding a sudo rule is part of the magic and the single root command that is executed.  You can also make it restart Postfix, Dovecot, or any other service you use a certificate and that needs restarting in order to take the new certificate.

In order to let you read it all from this article, I’ll borrow the example’s from getssl’s github page and then add in my own suggestions.

Now you want to prepare the environment (as the user acme) for your domain:

getssl -c yourdomain.com

This will create a ~/.getssl/yourdomain.com directory, the main files you want are called getssl.cfg, there’s a global file on ~/.getssl/getssl.cfg and then more specific files per domain, ~/.getssl/yourdomain.com/getssl.cfg

In the main file, ~/.getssl/getssl.cfg, you’ll need to set up the values accordingly to your needs (I won’t dive into how to get an account), but  for this setup you’ll want to change the following:

RELOAD_CMD="/usr/bin/sudo systemctl restart httpd"
ACL=('/var/www/html/letsencrypt/.well-known/acme-challenge')
CA_CERT_LOCATION="/etc/letsencrypt/acme/ssl.crt/lets-encrypt-x3-cross-signed.pem
RENEW_ALLOW="30"

And that RELOAD_CMD right there is part of the magic…

Now edit  ~/.getssl/yourdomain.com/getssl.cfg and change the following:

DOMAIN_CERT_LOCATION="/etc/letsencrypt/acme/ssl.crt/yourdomain.com.crt"
DOMAIN_KEY_LOCATION="/etc/letsencrypt/acme/ssl.key/yourdomain.com.key"

Now all you need is to set up a cron job:

45 6 * * * /home/letsencrypt/getssl -u -a -q

And finally you configure Apache httpd to use the files paths for the CERTificate and its KEY:

(...)
SSLCertificateFile /etc/letsencrypt/acme/ssl.crt/blog.1407.org.crt
SSLCertificateKeyFile /etc/letsencrypt/acme/ssl.key/blog.1407.org.key
SSLCertificateChainFile /etc/letsencrypt/acme/ssl.crt/lets-encrypt-x3-cross-signed.pem
Alias /.well-known/acme-challenge /var/www/html/letsencrypt/.well-known/acme-challenge
(...)

And you’re done: the cron job will run every day, and when you reach the 30 days to renew threshold your certificate will be renewed with minimal root usage.

 

Forgot to set email in your pump.io? Fix it!

Pump.io is an awesome distributed/federated social network, but it’s still green software and has many rough edges. One boring one is that when you’re setting up your instance you may run into the pitfall of not setting your email, and then after you posted more than you’d want to loose by resetting it… you can’t enable requireEmail anymore because you’ll be kept out of your own instance.

Sucks, innit? But there’s a fix, all you need to do is add the email field to your user’s data. In my example I’ll be using redis so your millage may vary according to your choice of databank, but the idea is the same, just figure out what your particular case needs to do to implement the same idea.

You can get your user’s data and fix it like this (note, lines broken for blog display):

redis your.ip.addr.ess:6379> get user:RuiSeabra
"{\"nickname\":\"RuiSeabra\",\"updated\":\"2013-08-15T20:42:58Z\",
   \"published\":\"2013-08-15T20:42:58Z\",\"_passwordHash\":\"haha",
   \"profile\":{\"objectType\":\"person\",
   \"id\":\"acct:RuiSeabra@p.1407.org\"}}"

redis your.ip.addr.ess:6379> set user:RuiSeabra
"{\"nickname\":\"RuiSeabra\",\"updated\":\"2013-08-15T20:42:58Z\",
   \"published\":\"2013-08-15T20:42:58Z\",\"_passwordHash\":\"haha",
   \"profile\":{\"objectType\":\"person\",
   \"email\":\"my-rms-email@1407.org\",
   \"id\":\"acct:RuiSeabra@p.1407.org\"}}"

So now it’s fixed and you can re-enable requireEmail in your pump.io.json:

[rms@pump ~]$ sudo grep -i requir /etc/pump.io.json
    "requireEmail": true,

HOWTO: pump.io behind Apache

Pump.io is very interesting, but it used to be very hard to put to work behind a frontend, mostly because of web sockets and being designed to be directly connected.

This means that your nodejs-enabled pump.io consumed an IP:port pair and since pump.io is an https oriented application (can be run in http but you really don’t want that) that means your https port (who has more than one IP either at home or his VPS?) is now BUSY with one single application… sucks and I gave up for some time and wasted my connection’s IP address at the standard https port.

Meanwhile… Good news, everyone!

I recently came up a new Apache module for web sockets: mod_proxy_wstunnel.

Searching for pump.io and wstunnel… it turns out my irrational friend Mark Jaroski also published a note about that! Please note that you may not need to build the module, if you have a recent enough Apache 2.4.x version it may already be there, check your bundled modules!

So here’s my setup: the OpenWRT router forwards port 443 incoming into a frontend KVM guest running Apache httpd which then forwards to some of my sites, one of which is my pump at https://p.1407.org/

The frontend’s web site looks like this:

<VirtualHost *:443>
        ServerName p.1407.org
        CustomLog logs/https-p.1407.org-access_log common
        ErrorLog logs/https-p.1407.org-error_log
        DocumentRoot /var/www/html/default

        SSLEngine On
        SSLCertificateFile conf/ssl.crt/p.1407.org.crt
        SSLCertificateKeyFile conf/ssl.key/p.1407.org.key
        SSLCertificateChainFile conf/ssl.crt/startssl-chain.crt
        SSLCACertificateFile conf/ssl.crt/startssl-chain.crt

        SSLProxyEngine On

        <Location /main/realtime/sockjs>
                ProxyPass wss://192.168.x.y/main/realtime/sockjs
                ProxyPassReverse wss://192.168.x.y/main/realtime/sockjs
        </Location>

        <LocationMatch ".*\.(jpg|png|gif)$">
                CacheEnable disk
        </LocationMatch>

        ProxyPreserveHost On

        ProxyPass               /       https://192.168.x.y/
        ProxyPassReverse        /       https://192.168.x.y/
</VirtualHost>

And at my pump.io KVM guest, 192.168.x.y, I have…

{
    "driver":  "redis",
    "noweb":  false,
    "site":  "1407 Pump",
    "owner":  "Rui Seabra",
    "ownerURL":  "https://blog.1407.org/",
    "port":  443,
    "hostname":  "p.1407.org",
    "nologger":  false,
    "serverUser":  "pumpio",
    "key":  "/etc/pump.io/p.1407.org.key",
    "cert":  "/etc/pump.io/unified-p.1407.org.crt",
    "uploaddir": "/opt/pump.io/uploads",
    "logfile": "/var/log/pump.io/activity.json",
    "debugClient": false,
    "firehose": "ofirehose.com",
    "disableRegistration": true,
    "requireEmail": false,
    "smtpserver": "put.your.own.here",
    "smtpuser": "aLoginAtYourServer",
    "smtppass": "some good password",
    "smtpusetls": true,
    "smtpport": 587,
    "smtpfrom": "pump@1407.org",
    "secret": "some good secret"
}

So there you go…

 

4 (out of 5) ssh security tips

There are some security tips for your sshd_config at http://www.debian-tutorials.com/5-steps-to-secure-your-ssh-server however the third one, Change the SSH Port on the server, is a lot of hot air.

“By changing the default port you will make SSH server more secure. By changing the default port you will reduce the amount of brute force attacks.”

Only the second phrase of this statement is truthful, but still, not by a wide margin…

Security by obscurity never works, it’s better to follow the other 4 advices and use fail2ban or something similar.

Starting OMNewRotate automatically

Following a question from Leonti Bielski in the OpenMoko Community Mailing List, here’s a tip on how to start OMNewRotate (or any other rotate for that matter). Just execute the following (from the phone’s terminal or from an SSH connection), and restart the xserver:

echo '/home/root/rotate&' > /etc/X11/Xsession.d/89rotate
chmod a+rx /etc/X11/Xsession.d/89rotate

My first reply has a bug, so maybe you should trust the above version better. I think Leonti caught it, since it worked for him 🙂

ATMs da NetPay cobram Taxa!!

Alerta à navegação: nenhum dos meus artigos reflecte a opinião do meu empregador, e como trabalho na SIBS, SA este em particular necessita deste alerta, também para que possam avaliar se estou a ser tendencioso ou não.

Soube que o BPN Já Cobra Comissões na sua rede ATM. Isto acontece porque hoje em dia já praticamente não existem cartões exclusivamente Multibanco. São quase todos ligados à rede Visa (os Electrons), Mastercard (Maestro), etc… Um dos motivos para isto, é que as pessoas gostam de poder utilizar os seus cartões “Multibanco” no estrangeiro (sem necessitar de adquirir um cartão de crédito de um operador internacional como a Visa).

Com estes cartões «não Multibanco puro», a rede do BPN (NetPay) vai directamente aos respectivos operadores, e aí há taxas. Segundo o artigo:

«o banco emitiu um esclarecimento explicando que são aplicadas taxas se o levantamento for feito com “cartões com a marca Multibanco e que são normalmente emitidos sob uma insígnia internacional – Visa ou Mastercard – que funcionam a crédito e a débito (vulgarmente designados por duais ou mistos) e permitem que em ATM Sibs (Multibanco) o cliente possa efectuar levantamentos a débito (default) ou a crédito”.»

Não é um apelo a que não usem, não me cabe a mim fazer tal coisa, é apenas um esclarecimento de uma situação que também já me tinha acontecido (não percebia porque apareciam umas taxas) pessoalmente, e que finalmente vi esclarecida (também não quis perguntar internamente para reduzir o meu conhecimento ao que é público).

No caso dos levantamentos feitos com estes 18 milhões de cartões nas 77 ATM da rede NetPay, (…) A NetPay não usa o processador nacional, a Sibs, e processa as suas operações no exterior.

Desconheço se há alguma forma de a NetPay distinguir ou não se é um cartão nacional em cujo caso deveria passar a transacção para a rede da SIBS, mas é importante salientar que os clientes da SIBS são os seus donos, os bancos, não nós como pessoas individuais, e o BPN é um dos seus accionistas logo acho estranho que isto aconteça. Nós somos clientes dos bancos, e estes é que nos vendem um acesso à “sua” rede de pagamentos através de um cartão que nos alugam.

Se não querem taxas na rede da NetPay, é necessário perguntar ao BPN porque é que as está a aplicar!

Precisa de passaporte? É urgente? Está tudo fechado? Vá ao SEF!

Ok, foi lerdice nossa admitidamente pois sempre viajamos dentro da Europa, mas hoje por volta do meio dia dizem-nos que necessitamos de passaporte para uma viagem. É o pânico total! Uma maquia razoável em vias de ir para o lixo.

  • Mal recebemos a notícia, tentamos descobrir como nos resolver, e dizem-nos que o melhor é ir ao Governo Civil. Sábado, estão a ver? Correria louca até à Loja do Cidadão mais próxima. Não há hipótese, só recebem os pedidos e depois encaminham para o Governo Civil, na melhor das hipóteses às 16h de Segunda é entregue. Está o leite a entornar…
  • Correria para o Governo Civil, chegamos lá já às 13, porta fechada claro. Leite todo entornado no chão.
  • Entretanto a burra da agência (o muito prestável que foi não compensou a burrice infelizmente) agenda-nos um avião que parte às 11 de Lisboa para ligar com o nosso em Madrid. Alguma esperança… o Governo Civil abre às 9…
  • Vamos à TAP para confirmar/pagar a nova reserva. Não pode ser, temos de pagar à agência e eles não nos dizem mais nada. De qualquer das formas, o check-in fecha uma hora antes do voo (10h portanto), e o avião chega apenas 2h antes do voo em Madrid, logo a probabilidade é de falhar o voo em Lisboa, e caso fosse apanhado de falhar em Madrid. Leite novamente entornado.
  • Telefonamos a amigos que nos mencionaram que no SEF seria possível. Volta a haver esperança.
  • Falamos com seguranças: não, apenas para levantar passaportes. Para emitir novos, só no serviço central do SEF que está fechado e reabre Segunda-feira. Leite novamente entornado.
  • Mas não desisti, começo a alegar querer levantar um passaporte já emitido e os seguranças lá me explicam que há um telefone com uma iluminação verde à sua volta, onde podemos ligar para o SEF (a extensão está escrita num painel por cima do telefone).
  • falamos com o SEF: é tirado no momento, precisa de duas fotografias, e custa 120.10€ por pessoa.
  • Combinamos um ponto de encontro, esperamos, esperamos vão 10 minutos, nada. Tentamos falar outra vez: «Ainda não foi aí ninguém? Então já aí vai.»
  • Esperamos, esperamos, no total já vão 3/4 de hora à espera numa secção do aeroporto onde não há nenhum local excepto o chão para uma pessoa se sentar até que volto a telefonar, e desta vez chega um agente do SEF para nos buscar.
  • Seguimos pelo aeroporto adentro, até que ouvimos alguém a chamar, como o agente ignorou e continuou, nós também o fizemos, até que fomos interpolados por um segurança da Prossegur que exigia que fossemos revistados.
  • O agente do SEF nem me deixou justificar-me dizendo que ali quem fala é ele, e tentou explicar firmemente ao segurança que aquela área do aeroporto é do SEF, e é ele que nos está a acompanhar, que não temos nada que passar na área de controle da Prossegur.
  • Mas o segurança não saia da dele, embora se tenha visto limitado a nos acompanhar até ao posto do SEF enquanto trocavam mimos.
  • Depois o agente esclareceu-nos: onde é que isto iria parar se ele deixasse que um segurança (que é um civil) achar-se com mais autoridade que a polícia, especialmente dentro da sua (SEF) própria jurisdição.

Em suma: um inferno de stress das 12 às 22:30, que teve um final feliz. 1h e 240.20€ por um par de documentos válidos por seis meses, mas era deitar fora isso ou 5 vezes mais sem qualquer proveito.

Moral da história:

  1. não recomendo como a forma de obter um passaporte
  2. mas numa emergência e estando tudo o mais fechado…
  3. peguem em «120.10€ + 2 fotografias + bilhete de identidade» por pessoa e dirijam-se aos telefones verdes no aeroporto de Lisboa para chamarem por alguém do SEF para a emissão de passaportes urgentes.

Os meus muito agradecidos parabéns aos agentes do SEF. Foram extremamente simpáticos, muito prestáveis, e salvaram-nos as férias.

FreeDOS usb bootdisk HOWTO

I wanted to upgrade my BIOS, but I only want to use Free Software. Right now, the only exception I have to do is the BIOS for which I don’t have much choice there. But I want to avoid MS-DOS if I can, so I investigated how to get FreeDOS to boot on an USB disk. Success! It worked. Here’s what I did.

Partitioning the usb stick

In my case, the USB disk was /dev/sdb, so I launched parted in order to prepare the boot disk. Since I have a 64MB usb drive lying around, I’ll use it. You may need to replace fat16 by fat32 if you want to use way bigger partitions:

[root@roque ~]# parted /dev/sdb mklabel msdos
Warning: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? yes
New disk label type?  [msdos]?
Information: Don't forget to update /etc/fstab, if necessary.

[root@roque ~]# parted /dev/sdb print
Model: FlashDis Flash Disk (scsi)
Disk /dev/sdb: 65.5MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start  End  Size  Type  File system  Flags

Information: Don't forget to update /etc/fstab, if necessary.


[root@roque ~]# parted /dev/sdb mkpart primary fat16 0 64MB
[root@roque ~]# parted /dev/sdb toggle 1 boot

Pay attention that if you see Partition Table: loop then beware, since it doesn’t support bootable flag, so you really need to run the mklabel part in order to change it to msdos. After that, you’ll need to make a partition as well.

Installing a boot loader

While a friend was trying at the same time to use syslinux, I tried grub, but it still needed some help from a syslinux file, memdisk :). Here’s how I did it:

mount /dev/sdb1 /mnt
cp -r /boot/grub /mnt
cp /usr/lib/syslinux/memdisk /mnt
cd /mnt/grub
echo '(hd0)     /dev/sda' > device.map
cat  grub.conf
default=0
timeout=10
bootsplash=/grub/splash.xpm.gz
root=(hd0,0)
title FreeDOS
        kernel /memdisk
        initrd /fdodin06.144

EOF
cd ..
wget -c http://odin.fdos.org/fdodin06.bin.zip
unzip fdodin06.bin.zip fdodin06.144 
Archive:  fdodin06.bin.zip
  inflating: fdodin06.144            

Now we need to put grub into the MBR (master boot record), this is how I did it:

grub> find /grub/stage1
find /grub/stage1
 (hd0,0)
 (hd1,0)

There’s two of them. That’s not good, is it? No, it’s in fact quite normal. The first one is from /dev/sda, my main hard disk. You’ll have to go to the correct partition though:

grub> root (hd1,0)
root (hd1,0)
 Filesystem type is fat, partition type 0xe
grub> setup (hd1)
setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/fat_stage1_5" exists... yes
 Running "embed /grub/fat_stage1_5 (hd1)"... failed (this is not fatal)
 Running "embed /grub/fat_stage1_5 (hd1,0)"... failed (this is not fatal)
 Running "install /grub/stage1 (hd1) /grub/stage2 p /grub/grub.conf "... succeeded
Done.

Now it will boot from the usb drive, and launch grub.

boot and test

So I guess this is your final stage… place what you need to run in the usb stick, unmount it and there you go!

Now you can use that pesty BIOS upgrade proprietary crap.

References

Sapo Vídeos: Usa MPlayer

É possível ver e gravar conteúdos do Sapo Vídeos e do YouTube, na janela do Firefox, sem utilizar o Flash proprietário, na realidade sem utilizar qualquer Flash 🙂

Diria mesmo mais, o pequeno pormenor de poder gravar já dá uma vantagem significativa do mplayerplug-in face ao Flash.

A receita:

  1. instalar o mplayerplug-in (ou mozilla-mplayer)
  2. instalar a extensão greasemonkey para o Firefox, e depois de reiniciar o browser, carregar…
  3. aqui para o Sapo Videos
  4. aqui para o YouTube

Tendo por base o YouTubeUseMplayer foi fácil criar o SapoVideosUsaMplayer.
Viva o GreaseMonkey!

Pelo menos no Ubuntu ambos os programas acima indicados já-se encontram nos repositórios, bastando então executar…

sudo aptitude install mplayerplugin-in firefox-greasemonkey

Continue reading “Sapo Vídeos: Usa MPlayer”