End-to-end automated environment
Unix tools introduced. Today: pgrep
pgrep looks through the currently running processes and lists the process IDs. Use
pgrep -f 'process_name'
to find the process ID of a process.
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
Kubernetes is the new OS …
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 does the .d stand for in directory names?
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:
-
read -s -t.1 -n1 c
to read exactly one character (-n1) into a variable c only waiting 0.1 seconds for user input. sleep .1
to delay further processing for 0.1 secondssecs=$(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
- Kubernetes Introduction for VMware Users – Part 1: The Theory
- Containers and Kubernetes: The Time Is Now
- https://www.infoworld.com/article/3268073/kubernetes/what-is-kubernetes-container-orchestration-explained.html
Power Up Your Command Line
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 .
- Loading logs into a log file analyser https://matomo.org/
- 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:
- In ein Analysetool laden. z.B. https://matomo.org/
- 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.
Backup MySQL
This is how I backup MySQL databases.
Solution consists of three files
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