Unix tools introduced. Today: Readonly SFTP

To create a user (sftp) with readonly  access via sftp to a single directory (/var/sftp_readonly), perform the following steps:

sudo su #become root

useradd sftp #create new user

passwd sftp #set a password

groupadd sftp_readonly #create a group

mkdir /var/sftp_readonly #create a directory

usermod -G sftp_readonly sftp # add user to group

chmod 755 /var/sftp_readonly/ #allow others to read

cp /etc/ssh/sshd_config ~/sshd_config.bck #backup your ssh config

editor  /etc/ssh/sshd_config # edit your ssh_config

Add the following lines to the bottom of /etc/ssh/sshd_config

Match Group sftp_readonly
  X11Forwarding no
  AllowTcpForwarding no
  ChrootDirectory /var/sftp_readonly/
  ForceCommand internal-sftp

Also make sure that the following line is present

Subsystem sftp internal-sftp

Reload your ssh service

sudo service ssh reload

 

 

Unix tools introduced. Today: FHS

The Filesystem Hierarchy Standard (FHS) defines a standard layout to organize various kinds of application and OS related data in a predictable and common way [1].

A basic knowledge of the FHS will help you to find application or OS related data more easily. If you are a developer, it also provides a good orientation for organizing your own applications in a maintainable way, e.g. as ubuntu package.

/bin – essential user commands

/boot – OS boot loader

/dev – devices (everything is a file principle)

/etc – system configuration

/home – user data

/lib – essentail shared libraries

/media – mount point for removable media

/mnt – mount point for temporarily mounted filesystems

/opt – add-on applications

/root – home of root

/run – run time variable data

/sbin – system binaries

/srv – data for services provided by the system

/tmp – temporary data

/proc – is a virtual filesystem

/usr – secondary hierarchy

bin – Most user commands
lib – Libraries
local – Local hierarchy (empty after main installation)
sbin – Non-vital system binaries
share – Architecture-independent data

/var – variable data

cache  – Application cache data
lib  – Variable state information
local  – Variable data for /usr/local
lock –  Lock files
log – Log files and directories
opt – Variable data for /opt
run – Data relevant to running processes
spool – Application spool data
tmp  -Temporary files preserved between system reboots

Find more

What about – /init.d ?

What does the .d stand for in directory names?

FHS in Debian

 

A stopwatch in bash

Is it possible to implement a stopwatch in bash? Here is my try:

https://github.com/jschnasse/stopwatch/blob/master/stopwatch

The script uses some interesting features like:

  1.  read -s -t.1 -n1 c to read exactly one character (-n1) into a variable c only waiting 0.1 seconds for user input.
  2. sleep .1 to delay further processing for 0.1 seconds
  3. secs=$(printf "%1d\n" ${input: 0 : -9})Create a digit from all but the last 9 characters lead by a zero if string is empty. This is used to separate seconds from a nano seconds. 

Unix tools introduced. Today: date

The unix tool date can be used to print the current date. It also can be used to calculate time spans or to reformat time strings.

Examples:
1. Print the current date in a conventional form

date +"%d. %B %Y"

2. Use certain locale. Find supported list in /usr/share/i18n/SUPPORTED

LANG=de_DE.UTF-8 date +"%d. %B %Y"

3. Print an arbitrary (but valid) timestring in a conventional form

date -d 2003-11-22 +"%d. %B %Y"

4. Print the current date as seconds since 1970 (unix epoche)

date +%s

5. Calculate the difference of two dates in days. Explanation can be found here.

A="2002-10-20"
B="2003-11-22"
echo $(( ($(date -d $B +%s) - $(date -d $A +%s)) / 86400 )) days

6. Print seconds after 1970 (unix epoche) in a conventional form.

TZ=UTC LANG=en_EN.UTF-8  date -d@0 +"%H:%M:%S %d. %B %Y"

Note: if TZ=UTC is left out, date will add or subtract an offset in accordance to systems timezone.

7. Find timezone offset

OFF_1=$(date -d '1 Jan' +%z)
OFF_7=$(date -d '1 Jul' +%z)
echo $OFF_1 $OFF_7

 

Kubernetes, Docker, vSphere und Co.

Software Development Process

Als Entwickler sucht man möglichst einfache Wege, seine Software zu veröffentlichen und zu installieren. Idealerweise kann die Installation und Veröffentlichung der Software in den normalen Entwicklungsprozess integriert werden, so dass nach erfolgreichem Durchlaufen der Testprozeduren ein fertiges Paket zur Installation bereit liegt.

Serverless

Der Entwickler übernimmt dabei die Verantwortung seine Software als lauffähiges Paket bereit zu stellen. Damit dies gelingen kann, müssen Kenntnisse über die siginifikanten Eigenschaften der Zielplattform bekannt sein. Je weniger solcher Eigenschaften der Entwickler beim Paketieren berücksichtigen muss, desto besser.

Aus ihrer Tätigkeit heraus, haben Entwickler nur über einige Aspekte Ihrer Software überhaupt Kenntnisse. Idealerweise reichen diese natürlichen Kenntnisse aus, um ein lauffähiges Paket für die Zielplattform zu erzeugen.

zum Beispiel:

  • benötigte Bibliotheken
  • benötigte Systempfade
  • benötigte Drittdienste
  • benötigte Ports

Infrastructure as a Service

Dabei sind eine Vielzahl von Aspekten, die im Entwicklungsprozess keine Rolle spielen, für den erfolgreichen Betrieb der Software von höchster Wichtigkeit.

zum Beispiel:

  • benötigte  Systemgröße – CPUs, RAM, Storage
  • benötigte Instanzen – Loadbalancing
  • Sicherheitsaspekte – Netzkonfiguration, DNS, SSL
  • Caching
  • Systembenutzer/Gruppen
  • Start/Stop Skripte
  • Monitoring

Über diese Aspekte können Entwickler oft nur wenig sagen. Eine aus Entwicklersicht ideale Umgebung, würde sich einfach den Erfordernissen der Software anpassen, bzw. mit einigen Handgriffen leicht anzupassen sein.

Eine solche Umgebung bereit zu stellen, ist die Triebfeder hinter Technologien wie Docker, Kubernetes, und/oderVMWare.  Durch den Einsatz dieser Technologien sollen alle Aspekte des Softwarebetriebs erfolgreich verwaltet werden können, über die Entwickler typischerweise keine Kenntnisse haben.

Quellen

  1. Kubernetes Introduction for VMware Users – Part 1: The Theory
  2. Containers and Kubernetes: The Time Is Now
  3. https://www.infoworld.com/article/3268073/kubernetes/what-is-kubernetes-container-orchestration-explained.html

 

Unix tools introduced. Today: yes

The unix tool yes provides one simple yet very useful functionality. It repeatedly  prints ‘yes’ (or any other string) to the console.

This can be used to automatically answer questions in scripted environments.

Example:

yes|sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

 

What to do with apache logs?

Two simple things are easily achievable .

  1. Loading logs into a log file analyser https://matomo.org/
  2. Depersonalize

An example setup on Ubuntu is shown below.

Configure two daily running cronjobs

0 1 * * * /scripts/import-logfiles.sh
0 2 * * * /scripts/depersonalize-apache-logs.sh

Use import-logfiles.sh to load all server requests into the matomo database. Use depersonalize-apache-logs.sh to anonymize all logs older than seven days. Depersonalization is achieved by replacing the last two bytes of IP-adresses with  0.

Both scripts work on a default Ubuntu setup of apache2.  Apache  Logfiles are  compressed and end with ‘gz’. They are placed in ‘/var/log/apache2’ and start with the prefix ‘localhost-access.’

Was tun mit Apache Logfiles?

Zwei Dinge, die gut umzusetzen sind:

  1. In ein Analysetool laden. z.B. https://matomo.org/
  2. Anonymisieren

Hier ein Beispiel Setup auf einem Ubunturechner.

Es werden zwei täglich laufende Cronjobs angelegt

0 1 * * * /scripts/import-logfiles.sh
0 2 * * * /scripts/depersonalize-apache-logs.sh

Mit dem `import-logfiles.sh` Skript werden nun einmal täglich die Serverrequests vom letzten Tag in die Matomodatenbank geladen. Mit dem  `depersonalize-apache-logs.sh` werden alle Logfiles, die älter als sieben Tage sind bearbeitet. Dabei werden für alle IPs die letzten zwei Bytes auf 0 gesetzt.

Beide Beispielskripte lassen sich auf Github finden. Beide Skripte gehen dabei davon aus, dass der Apache seine Logfiles rolliert und zu `gz` Dateien komprimiert, die unter `/var/log/apache2` liegen und immer mit dem String “other_vhosts_access.” beginnen.

import-logfiles.sh

depersonalize-apache-logs.sh

Backup MySQL

This is how I backup MySQL databases.

Solution consists of three files

Find complete solution here

The backup-db.sh is called every day with Parameter -b for backup and with parameter -c for cleanup. The backup routine dumps all MySQL databases into one file. The  cleanup routine removes old backups (older than 30 days, see LIMIT variable). The restore routine requires to hardcode a certain snapshot into the script. The variables.conf must be placed in same folder as backup-db.sh .

This is how the backup folder looks after running the script for 32 days at 23h.

20181009-023001.sql 20181020-023001.sql 20181031-023001.sql
20181010-023001.sql 20181021-023001.sql 20181101-023001.sql
20181011-023001.sql 20181022-023001.sql 20181102-023001.sql
20181012-023001.sql 20181023-023001.sql 20181103-023001.sql
20181013-023001.sql 20181024-023001.sql 20181104-023001.sql
20181014-023001.sql 20181025-023001.sql 20181105-023001.sql
20181015-023001.sql 20181026-023002.sql 20181106-023001.sql
20181016-023001.sql 20181027-023001.sql 20181107-023001.sql
20181017-023001.sql 20181028-023001.sql 20181108-023001.sql
20181018-023001.sql 20181029-023002.sql
20181019-023001.sql 20181030-023001.sql

The folder will contain backups for the last 31 days.

 

Ubuntu ufw firewall

Mit dem ufw-Kommando (Uncomplicated Firewall) steht auf Ubuntu eine sehr einfache Möglichkeit zur Verfügung, den iptables2 Paketfilter zu konfigurieren.

Bevor man die Firewall aktiviert, sollte man zumindest den SSH Zugriff freigeben! und die Dienste, die nach außen notwendig sind, z.B.

z.B

sudo ufw allow http
sudo ufw allow https
sudo ufw allow ssh

Nun kann man die neu gesetzten Regeln aktivieren

sudo ufw enable
sudo ufw status

Der Server wird jjetzt nur noch Anfragen auf den Ports 80,443 und 22 beantworten. Das Verhalten lässt sich im Logfile beobachten unter

sudo tail -f /var/log/ufw.log

Du kannst auch weitere Ports freigeben

ufw allow _any_port_number_

Oder auch einzelne Ports für einzelne IPs

ufw allow from 192.168.0.1 to any port 8080