hardening ssh (debian wheezy)

LogJam requires some action. (Article in german)

Update (open-)ssh to a recent version (6.6)

 

$ echo "deb http://ftp.de.debian.org/debian wheezy-backports main" | sudo tee -a /etc/apt/sources.list
$ sudo apt-get -u update
$ sudo apt-get install -t wheezy-backports ssh
$ sudo apt-get autoremove

Harden crypto

 

$ sudo tee -a /etc/ssh/sshd_config <<EOF_SSH_CFG
 
# https://stribika.github.io/2015/01/04/secure-secure-shell.html
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com
 
EOF_SSH_CFG
$ sudo /etc/init.d/ssh restart

Keys

Replace host keys, /etc/ssh/sshd_config

Protocol 2
# https://stribika.github.io/2015/01/04/secure-secure-shell.html#server-authentication
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key

and

$ cd /etc/ssh
$ sudo rm ssh_host_*key*
$ sudo ssh-keygen -t ed25519 -f ssh_host_ed25519_key < /dev/null
$ sudo ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key < /dev/null
$ sudo /etc/init.d/ssh restart

Resources

Flattr this!

redmine & chruby (fetch emails)

 

#!/bin/bash
# chruby needs bash
#
#
# redmine email import with chruby.
#
#
# Put this script into <redmine_dir>/script and a set crontab like
#   $ sudo -u www-data crontab -l
#   */15 * * * * <redmine_dir>/script/fetch-email.sh
#
cd "$(dirname "$0")/.."
 
log="log/$(basename "$0" .sh).log"
cat >> "$log" <<EOF
 
$(date --rfc-3339=seconds) $0
EOF
 
# https://github.com/postmodern/chruby
source /usr/local/share/chruby/chruby.sh
source /usr/local/share/chruby/auto.sh
 
# in case we use rbx in .ruby-version, we need to explicitly set ruby in
# script/fetch-email.sh due to
# https://github.com/rubinius/rubinius/issues/2916
chruby ruby || { echo "Failed to change ruby." 1>> "$log" && exit 1; }
 
bundle --version 1>/dev/null || { nice gem install bundle 1>> "$log" 2>> "$log" ; }
bundle check 1>/dev/null 2>/dev/null || { nice bundle install 1>> "$log" 2>> "$log" ; }
 
# http://www.redmine.org/projects/redmine/wiki/RedmineReceivingEmails
nice bundle exec rake redmine:email:receive_imap \
  RAILS_ENV="production" \
  host=<foo> \
  ssl=1 \
  port=993 \
  username=<bar> \
  password=<foobar> \
  unknown_user=accept \
  1>> "$log" \
  2>> "$log"

 

Flattr this!

USER_AGENT Blocking – sowas gibt’s wirklich!

schon kindisch, oder?

$ curl --head http://www.wetteronline.de/wetter/traunstein
HTTP/1.1 403 Forbidden
Server: AkamaiGHost
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 290
Expires: Mon, 27 Apr 2015 21:01:07 GMT
Date: Mon, 27 Apr 2015 21:01:07 GMT
Connection: keep-alive
Vary: User-Agent
 
$ curl -A Mozilla --head http://www.wetteronline.de/wetter/traunstein
HTTP/1.1 200 OK
Server: Apache
res-obj: www
Content-Type: text/html; charset=UTF-8
Date: Mon, 27 Apr 2015 21:01:14 GMT
Content-Length: 132153
Connection: keep-alive
Vary: User-Agent

Flattr this!

#Qualitätsjournalismus und Datenschutz

sz.de*) denkt sich wohl „was interessiert mich der Datenschutz meiner Besucher“.

an wen verpetzt mich die SZ alles? Natürlich ohne jeden Hinweis im Impressum - ganz zu schweigen davon das VORHER zu tun.

an wen verpetzt mich sz.de alles?
Hinweise versteckt weit unten im Impressum – allerdings wird selbst dort geschnüffelt und nicht vorher gefragt.

Danke Requestpolicy und ablopac, so bleiben mir die Schnüffler vom Hals.

*) andere große Verlage sind ähnlich, das ist im #Qualitätsjournalismus leider üblich.

Flattr this!

lua & timezones by name

A bit hard to puzzle due to scarce documentation.

#!/usr/bin/env lua
local luatz = require 'luatz' -- https://github.com/daurnimator/luatz/
 
local tz_name = 'Europe/Berlin'
local ts_loc = luatz.time({year=2014, month=12, day=31, hour=23, min=59})
 
-- %z isn't supported yet: https://github.com/daurnimator/luatz/blob/523b2e0f1ece77c569f6db4c040886ed3124512e/luatz/strftime.lua#L178
local function tz_off_iso8601(tz_offset_seconds)
  local separator = '' -- 8601 %z compliant
  -- separator = ':' -- 8601 W3C compliant http://www.w3.org/TR/xmlschema-2/#dateTime-timezones
  local tz_offset_minutes = tz_offset_seconds / 60
  local sign = string.byte('+')
  if tz_offset_minutes < 0 then sign = string.byte('-') end
  return string.format('%c%02d%s%02d', sign, tz_offset_minutes / 60, separator, tz_offset_minutes % 60)
end
 
local tzi = assert(luatz.get_tz( tz_name ), 'No such timezone: \''..tz_name..'\'')
local ts_utc = tzi:utctime ( ts_loc )
local t_loc = luatz.timetable.new_from_timestamp( ts_loc )
local t_utc = luatz.timetable.new_from_timestamp( ts_utc )
 
print( t_loc:strftime('%F %T'), tz_off_iso8601(tzi:find_current( ts_utc ).gmtoff), tz_name )
print( t_utc:strftime('%F %T'), tz_off_iso8601(0), 'UTC' )

Flattr this!

Why PHP is utterly broken

tl;dr: neither does DATE_RFC1123 produce a rfc1123-date, nor does DATE_RFC850rfc850-date. What sense does that make?

This example may look scrupulous but seems typical.

Mind the mandatory word ‚GMT‚ at the end of rfc1123-date. While DATE_RFC1123 renders something ending with +0000. Which is the same timezone but not the same string.

So DATE_RFC1123 is useless for HTTP headers (RFC2616). I wonder what else it should be there for.

While this isn’t an issue of PHP (the language) itself, it’s IMO typical for the actual PHP code existing. It does work somehow, despite the fact that it’s totally agnostic of the basics it claims to be based upon. So it may fail any given, unforeseeable, moment, when any of the implicitly assumed side-conditions change.

P.S.: The newer RFC7231 (HTTP-Date) and e.g. RFC 7232, Last-Modified don’t change a thing.

P.P.S.: I don’t do PHP, I just came across when patching https://github.com/mro/Shaarli a bit.

Update: Another nice one.

Flattr this!

Validate GPX

xmllint --noout --schema http://www.topografix.com/GPX/1/1/gpx.xsd <gpx file or url>

Flattr this!

T-Kom WLAN Hotspot auf einigen Bahnhöfen…

Nehmen wir mal kurz an, man ist T-Kom Kunde, steht im Zug auf dem Bahngleis und möchte per WLAN in’s Netz.

DB WLAN im Bahnhof: Täglich 30 Minuten kostenlos sagt:

30 Minuten gratis WLAN an über 120 Bahnhöfen

Das nennt man Service: Mit diesem innovativen und kundenorientierten Servicekonzept geben wir dem Warten eine neue Qualität.

Nutzen Sie Ihre Reisezeit noch effizienter: In über 120 Bahnhöfen bieten wir Ihnen einen Zugang zum Internet über das WLAN der Telekom. Jeden Tag sind die ersten 30 Minuten WLAN kostenlos, danach kann zu Telekom-Tarifen weiter gesurft werden.

An vielen Bahnhöfen können Sie WLAN nutzen. Mit dem Service von Telekom und der Deutschen Bahn surfen Sie problemlos mit Ihrem WLAN-fähigen Smartphone oder Tablet kabellos im Internet. Überall, wo Sie nebenstehendes blaues Piktogramm sehen, können Sie online gehen.

Die folgende Anleitung hat 8(!) Schritte.

Und so sieht das in der Praxis aus (obwohl die T-Kom noch nicht mal dem Risiko der Störerhaftung ausgesetzt ist):

Continue Reading »

Flattr this!

Key-based FTP authentication

  1. make a strong ssh key $ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
  2. turn to RFC 4716 $ ssh-keygen -e -f ~/.ssh/id_rsa.pub
  3. add to ~/.ssh/authorized_sftpkeys on destination host
  4. try out:
    1. $ curl -u "<username>:" --key ~/.ssh/id_rsa --pubkey ~/.ssh/id_rsa.pub -T <file to upload> sftp://<target host>/<target path>/
    2. $ lftp -u <username>,xx ... sftp://<target host>

P.S.: Hetzner FAQ zum Thema SFTP + Keys.

Flattr this!

Ad Blocking Proxy = abloprox

as an act of digital hygiene, I installed abloprox on a raspi and added this PAC file to save some keystrokes when configuring:

function FindProxyForURL(url, host) {
  if (shExpMatch(host,"*.fritz.box")) return "DIRECT";
  if (shExpMatch(host,"*.local")) return "DIRECT";
  if (shExpMatch(host,"*.akamaistream.net")) return "DIRECT";
  if (shExpMatch(host,"*.m945.mwn.de")) return "DIRECT";
  // auto config:
  // 1. ensure there's a host 'wpad' in the current network, see
  //   - https://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol#Context
  //   - http://fritz.box/net/network_user_devices.lua
  // 2. have a http webserver running on that host
  // 3. ensure http://wpad/wpad.dat or http://wpad.fritz.box/wpad.dat contains a PAC file like in http://blog.mro.name/2014/06/ad-blocking-proxy-abloprox/
  // return "PROXY wpad:3126"; // Default return condition is the proxy on host 'wpad'.
  return "PROXY <hostname_of_the_raspi>:3126"; // Default return condition is the proxy.
}

Update: I pushed this one step further recently and use the automatic proxy-configuration itself to filter — see http://purl.mro.name/wpad.

Update: hu – it took Android until version 5.0 (lollipop) to support PAC.

Flattr this!