From fed26c8bbd9fb6af28c8e5756ee2254b6e809c0e Mon Sep 17 00:00:00 2001 From: Markus Pesch Date: Wed, 13 Oct 2021 19:25:16 +0200 Subject: [PATCH] Initial Commit --- .drone.yml | 225 +++ .editorconfig | 12 + .gitattributes | 1 + .gitignore | 225 +++ .latexmkrc | 15 + Makefile | 90 ++ README.md | 71 + awk/01-aufgabe.sh | 3 + awk/02-aufgabe.sh | 3 + awk/03-aufgabe.awk | 9 + awk/03-aufgabe.sh | 3 + awk/04-aufgabe.awk | 9 + awk/04-aufgabe.sh | 3 + awk/05-aufgabe.awk | 14 + awk/05-aufgabe.sh | 3 + awk/06-aufgabe.awk | 29 + awk/06-aufgabe.sh | 3 + awk/07-aufgabe.awk | 76 + awk/07-aufgabe.sh | 3 + chapters/01-ssh.tex | 201 +++ chapters/02-dns.tex | 208 +++ chapters/03-network.tex | 274 ++++ chapters/04-file-permissions.tex | 673 ++++++++ chapters/05-directory-structure.tex | 221 +++ chapters/06-filesystems.tex | 404 +++++ chapters/07-backups.tex | 204 +++ chapters/08-textprocessing.tex | 649 ++++++++ chapters/99-awk.tex | 134 ++ chapters/99-questions.tex | 30 + csv/credit_master.csv | 1399 ++++++++++++++++ csv/credit_master_cleaned.csv | 1369 ++++++++++++++++ ...aufgabe-netze-mit-internetanbindung.drawio | 1 + draw/btrfs-cow.drawio | 1 + draw/differentielles-backup.drawio | 1 + ...infache-netze-mit-internetanbindung.drawio | 1 + draw/einfache-netze.drawio | 1 + draw/inkrementell-backup.drawio | 1 + draw/overlayfs.drawio | 1 + draw/vollbackups.drawio | 1 + draw/zwei-netze-mit-internetanbindung.drawio | 1 + examples/examples.tex | 246 +++ examples/test.awk | 11 + examples/test.json | 22 + examples/test.r | 0 examples/test.sql | 3 + examples/test.xml | 20 + git-info.sh | 15 + img/aufgabe-netze-mit-internetanbindung.png | Bin 0 -> 58726 bytes img/btfs_subvol_snaps.jpg | Bin 0 -> 43267 bytes img/btrfs-cow.png | Bin 0 -> 33952 bytes img/differentielles-backup.png | Bin 0 -> 23926 bytes img/einfache-netze-mit-internetanbindung.png | Bin 0 -> 28413 bytes img/einfache-netze.png | Bin 0 -> 21720 bytes img/inkrementell-backup.png | Bin 0 -> 23181 bytes img/logo.png | Bin 0 -> 21727 bytes img/overlayfs.png | Bin 0 -> 23276 bytes img/vollbackups.png | Bin 0 -> 13301 bytes img/zwei-netze-mit-internetanbindung.png | Bin 0 -> 51534 bytes index.tex | 442 +++++ referenzen/bibliothek.bib | 87 + referenzen/glossar.tex | 40 + solutions/07-backups.md | 70 + solutions/overlayfs.sh | 38 + sql/.gitkeep | 0 sql/credit_master_cleaned.sql | 1419 +++++++++++++++++ titel/titel.tex | 31 + 66 files changed, 9016 insertions(+) create mode 100644 .drone.yml create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .latexmkrc create mode 100644 Makefile create mode 100644 README.md create mode 100755 awk/01-aufgabe.sh create mode 100755 awk/02-aufgabe.sh create mode 100644 awk/03-aufgabe.awk create mode 100755 awk/03-aufgabe.sh create mode 100644 awk/04-aufgabe.awk create mode 100755 awk/04-aufgabe.sh create mode 100644 awk/05-aufgabe.awk create mode 100755 awk/05-aufgabe.sh create mode 100644 awk/06-aufgabe.awk create mode 100755 awk/06-aufgabe.sh create mode 100644 awk/07-aufgabe.awk create mode 100755 awk/07-aufgabe.sh create mode 100644 chapters/01-ssh.tex create mode 100644 chapters/02-dns.tex create mode 100644 chapters/03-network.tex create mode 100644 chapters/04-file-permissions.tex create mode 100644 chapters/05-directory-structure.tex create mode 100644 chapters/06-filesystems.tex create mode 100644 chapters/07-backups.tex create mode 100644 chapters/08-textprocessing.tex create mode 100644 chapters/99-awk.tex create mode 100644 chapters/99-questions.tex create mode 100644 csv/credit_master.csv create mode 100644 csv/credit_master_cleaned.csv create mode 100644 draw/aufgabe-netze-mit-internetanbindung.drawio create mode 100644 draw/btrfs-cow.drawio create mode 100644 draw/differentielles-backup.drawio create mode 100644 draw/einfache-netze-mit-internetanbindung.drawio create mode 100644 draw/einfache-netze.drawio create mode 100644 draw/inkrementell-backup.drawio create mode 100644 draw/overlayfs.drawio create mode 100644 draw/vollbackups.drawio create mode 100644 draw/zwei-netze-mit-internetanbindung.drawio create mode 100644 examples/examples.tex create mode 100644 examples/test.awk create mode 100644 examples/test.json create mode 100644 examples/test.r create mode 100644 examples/test.sql create mode 100644 examples/test.xml create mode 100755 git-info.sh create mode 100644 img/aufgabe-netze-mit-internetanbindung.png create mode 100644 img/btfs_subvol_snaps.jpg create mode 100644 img/btrfs-cow.png create mode 100644 img/differentielles-backup.png create mode 100644 img/einfache-netze-mit-internetanbindung.png create mode 100644 img/einfache-netze.png create mode 100644 img/inkrementell-backup.png create mode 100644 img/logo.png create mode 100644 img/overlayfs.png create mode 100644 img/vollbackups.png create mode 100644 img/zwei-netze-mit-internetanbindung.png create mode 100644 index.tex create mode 100644 referenzen/bibliothek.bib create mode 100644 referenzen/glossar.tex create mode 100644 solutions/07-backups.md create mode 100644 solutions/overlayfs.sh create mode 100644 sql/.gitkeep create mode 100644 sql/credit_master_cleaned.sql create mode 100644 titel/titel.tex diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..98d3e03 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,225 @@ +--- +kind: pipeline +type: kubernetes +name: latest + +platform: + os: linux + arch: amd64 + +steps: +- name: build + commands: + - make latexmk/index.pdf + image: docker.io/volkerraschek/latex:latest-archlinux + resources: + limits: + cpu: 500 + memory: 250M + +- name: push-nextcloud + commands: + - curl --fail --user $WEBDAV_USER:$WEBDAV_PASSWORD --upload-file index.pdf --location https://nextcloud.cryptic.systems/remote.php/dav/files/markus.pesch/Dokumente/Studium/Fachschaftdaten/LX_-_Linux/linux_ws2122/Aufgabensammlung.pdf + depends_on: + - build + environment: + WEBDAV_USER: + from_secret: webdav_username + WEBDAV_PASSWORD: + from_secret: webdav_password + image: docker.io/volkerraschek/latex:latest-archlinux + resources: + limits: + cpu: 50 + memory: 25M + when: + repo: + - fh-trier/linux_ws2122 + event: + - push + - cron + +- name: push-fhtrier + depends_on: + - build + image: docker.io/appleboy/drone-scp:1.6.2 + settings: + host: ssh.hochschule-trier.de + user: + from_secret: ssh_user_fh-trier + key: + from_secret: ssh_key + port: 22 + command_timeout: 2m + target: + - /dozenten/peschm/linux_ws2122 + source: + - index.pdf + - csv/* + - sql/* + when: + branch: + - master + repo: + - fh-trier/linux_ws2122 + event: + - push + - cron + +- name: email-notification + depends_on: + - push-nextcloud + - push-fhtrier + environment: + PLUGIN_HOST: + from_secret: smtp_host + PLUGIN_USERNAME: + from_secret: smtp_username + PLUGIN_PASSWORD: + from_secret: smtp_password + PLUGIN_FROM: + from_secret: smtp_mail_address + image: docker.io/drillster/drone-email:latest + resources: + limits: + cpu: 50 + memory: 25M + when: + status: + - changed + - failure + +trigger: + event: + exclude: + - tag + +--- +kind: pipeline +type: kubernetes +name: release + +platform: + os: linux + arch: amd64 + +steps: +- name: build + commands: + - make latexmk/index.pdf + environment: + VERSION: ${DRONE_TAG} + image: docker.io/volkerraschek/latex:latest-archlinux + resources: + limits: + cpu: 500 + memory: 250M + +- name: push-nextcloud + commands: + - curl --fail --user $WEBDAV_USER:$WEBDAV_PASSWORD --upload-file index.pdf --location https://nextcloud.cryptic.systems/remote.php/dav/files/markus.pesch/Dokumente/Studium/Fachschaftdaten/LX_-_Linux/linux_ws2122/Aufgabensammlung_${DRONE_TAG}.pdf + environment: + WEBDAV_USER: + from_secret: webdav_username + WEBDAV_PASSWORD: + from_secret: webdav_password + image: docker.io/volkerraschek/latex:latest-archlinux + resources: + limits: + cpu: 50 + memory: 25M + +- name: push-gitea + image: docker.io/plugins/gitea-release:latest + resources: + limits: + cpu: 50 + memory: 25M + settings: + base_url: https://git.cryptic.systems + api_key: + from_secret: gitea_token + files: + - index.pdf + checksum: + - md5 + - sha1 + - sha256 + - sha512 + - adler32 + - crc32 + +- name: email-notification + environment: + PLUGIN_HOST: + from_secret: smtp_host + PLUGIN_USERNAME: + from_secret: smtp_username + PLUGIN_PASSWORD: + from_secret: smtp_password + PLUGIN_FROM: + from_secret: smtp_mail_address + image: docker.io/drillster/drone-email:latest + resources: + limits: + cpu: 50 + memory: 25M + when: + status: + - changed + - failure + +trigger: + event: + - tag + repo: + - fh-trier/linux_ws2122 + +# --- +# kind: pipeline +# type: kubernetes +# name: sync + +# platform: +# os: linux +# arch: amd64 + +# steps: +# - name: github +# image: docker.io/appleboy/drone-git-push:latest +# resources: +# limits: +# cpu: 50 +# memory: 25M +# settings: +# branch: master +# remote: ssh://git@github.com/fh-trier/linux_ws2122.git +# force: true +# ssh_key: +# from_secret: ssh_key + +# - name: email-notification +# environment: +# PLUGIN_HOST: +# from_secret: smtp_host +# PLUGIN_USERNAME: +# from_secret: smtp_username +# PLUGIN_PASSWORD: +# from_secret: smtp_password +# PLUGIN_FROM: +# from_secret: smtp_mail_address +# image: docker.io/drillster/drone-email:latest +# resources: +# limits: +# cpu: 50 +# memory: 25M +# when: +# status: +# - changed +# - failure + +# trigger: +# event: +# - push +# repo: +# - fh-trier/linux_ws2122 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..b53e68c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = false + +[Makefile] +indent_style = tab \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dcd9d00 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +Makefile eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..407663c --- /dev/null +++ b/.gitignore @@ -0,0 +1,225 @@ +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 + +## Intermediate documents: +*.dvi +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +*.pdf + +## Generated if empty string is given at "Please type another file name for output:" +#.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.gtex + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Comment the next line if you want to keep your tikz graphics files +*.tikz +*-tikzDictionary + +# listings +*.lol + +# makeidx +*.idx +*.ilg +*.ind +*.ist + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# nomencl +*.nlo + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# easy-todo +*.lod + +# xindy +*.xdy + +# xypic precompiled matrices +*.xyc + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# Kile +*.backup + +# KBibTeX +*~[0-9]* + +# auto folder when using emacs and auctex +/auto/* + +# expex forward references with \gathertags +*-tags.tex + +# Tmp files +git-id.tmp +git-date.tmp +git-url.tmp \ No newline at end of file diff --git a/.latexmkrc b/.latexmkrc new file mode 100644 index 0000000..bfb8f72 --- /dev/null +++ b/.latexmkrc @@ -0,0 +1,15 @@ +add_cus_dep('glo', 'gls', 0, 'run_makeglossaries'); +add_cus_dep('acn', 'acr', 0, 'run_makeglossaries'); + +sub run_makeglossaries { + if ( $silent ) { + system "makeglossaries -q '$_[0]'"; + } + else { + system "makeglossaries '$_[0]'"; + }; +} + +push @generated_exts, 'glo', 'gls', 'glg'; +push @generated_exts, 'acn', 'acr', 'alg'; +$clean_ext .= ' %R.ist %R.xdy'; \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f15244c --- /dev/null +++ b/Makefile @@ -0,0 +1,90 @@ +# VERSION / RELEASE +# If no version is specified as a parameter of make, the last git hash +# value is taken. +VERSION?=$(shell git describe --abbrev=0)+hash.$(shell git rev-parse --short HEAD) + +# CONTAINER_RUNTIME +# The CONTAINER_RUNTIME variable will be used to specified the path to a +# container runtime. This is needed to start and run a container images. +CONTAINER_RUNTIME?=$(shell which docker) + +# BUILD_IMAGE +# Definition of the container build image, in which the BInary are compiled from +# source code +BUILD_IMAGE_REGISTRY:=docker.io +BUILD_IMAGE_NAMESPACE:=volkerraschek +BUILD_IMAGE_NAME:=container-latex +BUILD_IMAGE_VERSION:=latest-archlinux +BUILD_IMAGE_FULL=${BUILD_IMAGE_REGISTRY}/${BUILD_IMAGE_NAMESPACE}/${BUILD_IMAGE_NAME}:${BUILD_IMAGE_VERSION} +BUILD_IMAGE_SHORT=${BUILD_IMAGE_NAMESPACE}/${BUILD_IMAGE_NAME}:${BUILD_IMAGE_VERSION} + +# Input tex-file and output pdf-file +FILE_NAME=index +IDX_TARGET:=${FILE_NAME:%=%.idx} +PDF_TARGET:=${FILE_NAME:%=%.pdf} +TEX_TARGET:=${FILE_NAME:%=%.tex} + +# PDF_TARGET +# ============================================================================== +${PDF_TARGET}: latexmk/${PDF_TARGET} + +PHONY:=latexmk/${PDF_TARGET} +latexmk/${PDF_TARGET}: + latexmk \ + -shell-escape \ + -synctex=1 \ + -interaction=nonstopmode \ + -file-line-error \ + -pdf ${TEX_TARGET} + +PHONY+=pdflatex/${PDF_TARGET} +pdflatex/${PDF_TARGET}: + + makeglossaries ${FILE_NAME} + makeindex ${FILE_NAME} + + pdflatex \ + -shell-escape \ + -synctex=1 \ + -interaction=nonstopmode \ + -enable-write18 ${TEX_TARGET} + +# CLEAN +# ============================================================================== +PHONY+=clean +clean: + git clean -fX + +# CONTAINER STEPS - PDF_TARGET +# ============================================================================== +container-run/${PDF_TARGET}: + $(MAKE) container-run COMMAND=${@:container-run/%=%} + +container-run/latexmk/${PDF_TARGET}: + $(MAKE) container-run COMMAND=${@:container-run/%=%} + +container-run/pdflatex/${PDF_TARGET}: + $(MAKE) container-run COMMAND=${@:container-run/%=%} + +# CONTAINER STEPS - CLEAN +# ============================================================================== +container-run/clean: + $(MAKE) container-run COMMAND=${@:container-run/%=%} + +# GENERAL CONTAINER COMMAND +# ============================================================================== +PHONY+=container-run +container-run: + ${CONTAINER_RUNTIME} run \ + --rm \ + --user $(shell id --user):${shell id --group} \ + --volume $(shell pwd):/workspace \ + ${BUILD_IMAGE_SHORT} \ + make ${COMMAND} \ + VERSION=${VERSION} \ + +# PHONY +# ============================================================================== +# Declare the contents of the PHONY variable as phony. We keep that information +# in a variable so we can use it in if_changed. +.PHONY: ${PHONY} diff --git a/README.md b/README.md new file mode 100644 index 0000000..9c30349 --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# Linux WS20/21 + +[![Build Status](https://drone.cryptic.systems/api/badges/fh-trier/linux_ws2021/status.svg)](https://drone.cryptic.systems/fh-trier/linux_ws2021) + +This repository contains the latex source code of the linux module on the +University of Applied Science for WS20/21. + +The document contains all tasks which the students should could solve before +they write their linux exam. + +## Compiling the PDF document + +There are two ways to compile the PDF document. Since the templates contain all +dependencies to the package `minted`, it is probably easier to use a container +image to compile the document. + +To do this, install docker or podman as container runtime and Make as build +tool. If you have docker or podman and Make installed execute `make +container-run/latexmk/index.pdf` to compile the PDF document by using a +container image. + +If you don't want to install a container runtime and the build tool make, you +have to install texlive manually - [installation instructions](https://www.tug.org/texlive/). + +## make commands + +### clean + +Deletes all files that were not checked in using git. + +```bash +make clean +``` + +### container-run/latexmk + +Uses a docker container to compile the PDF document with `latexmk` By default +the docker container `volkerraschek/container-latex:latest-ubuntu18.04` is used. +However, it can also be modified. The Makefile contains the variables with the +prefix `BUILD_IMAGE` to change the full qualified image path for this purpose. +However, you may have to change the docker command call in `container-run` if +necessary. + +```bash +make container-run/latexmk/index.pdf +``` + +### container-run/pdflatex + +Similar to container-run/latexmk/index.pdf, but in the container pdflatex will +be execute instead of latexmk. + +```bash +make container-run/pdflatex/index.pdf +``` + +### latexmk + +Executes latexmk natively in the system environment. + +```bash +make latexmk/index.pdf +``` + +### pdflatex + +Executes pdflatex natively in the system environment. + +```bash +make pdflatex +``` diff --git a/awk/01-aufgabe.sh b/awk/01-aufgabe.sh new file mode 100755 index 0000000..841b51d --- /dev/null +++ b/awk/01-aufgabe.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +awk -F ":" '{print $0;}' /etc/passwd \ No newline at end of file diff --git a/awk/02-aufgabe.sh b/awk/02-aufgabe.sh new file mode 100755 index 0000000..3f2f2ef --- /dev/null +++ b/awk/02-aufgabe.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +awk -F ":" 'BEGIN {printf "user badname shell\n";} {printf "%s %s %s\n", $1, $5, $7;}' /etc/passwd \ No newline at end of file diff --git a/awk/03-aufgabe.awk b/awk/03-aufgabe.awk new file mode 100644 index 0000000..417811c --- /dev/null +++ b/awk/03-aufgabe.awk @@ -0,0 +1,9 @@ +#!/bin/awk + +BEGIN { + printf "user badname shell\n" +} + +{ + if ( $3>=1000 ) printf "%s %s %s\n", $1, $5, $7; +} \ No newline at end of file diff --git a/awk/03-aufgabe.sh b/awk/03-aufgabe.sh new file mode 100755 index 0000000..ef115ad --- /dev/null +++ b/awk/03-aufgabe.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +awk -F ":" -f 03-aufgabe.awk /etc/passwd \ No newline at end of file diff --git a/awk/04-aufgabe.awk b/awk/04-aufgabe.awk new file mode 100644 index 0000000..2483a1f --- /dev/null +++ b/awk/04-aufgabe.awk @@ -0,0 +1,9 @@ +#!/bin/awk + +BEGIN { + printf " user badname shell\n" +} + +{ + if (FNR >= 5 && FNR <= 10) printf "%s %s %s %s\n", FNR, $1, badname, $7; +} \ No newline at end of file diff --git a/awk/04-aufgabe.sh b/awk/04-aufgabe.sh new file mode 100755 index 0000000..da78a7d --- /dev/null +++ b/awk/04-aufgabe.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +awk -F ":" -f 04-aufgabe.awk /etc/passwd \ No newline at end of file diff --git a/awk/05-aufgabe.awk b/awk/05-aufgabe.awk new file mode 100644 index 0000000..a3f4dc5 --- /dev/null +++ b/awk/05-aufgabe.awk @@ -0,0 +1,14 @@ +#!/bin/awk + +function logical_decission(i, user, badname, shell) { + if (i >= 5 && i <= 10) printf "%s %s %s %s\n", i, user, badname, shell; +} + + +BEGIN { + printf " user badname shell\n" +} + +{ + logical_decission(FNR, $1, $5, $7) +} \ No newline at end of file diff --git a/awk/05-aufgabe.sh b/awk/05-aufgabe.sh new file mode 100755 index 0000000..ca166a1 --- /dev/null +++ b/awk/05-aufgabe.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +awk -F ":" -f 05-aufgabe.awk /etc/passwd \ No newline at end of file diff --git a/awk/06-aufgabe.awk b/awk/06-aufgabe.awk new file mode 100644 index 0000000..a80bdff --- /dev/null +++ b/awk/06-aufgabe.awk @@ -0,0 +1,29 @@ +#!/bin/awk + +function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s } +function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s } +function trim(s) { ; return rtrim(ltrim(s)); } + +function validBool(s) { + if (s == "ja" || s == "nein") { + return "1"; + } else { + return "0"; + } +} + +{ + if (FNR > 1) { + if ( validBool($4) == "0" ) { next; } + if ( validBool($9) == "0" ) { next; } + if ( validBool($10) == "0" ) { next; } + if ( validBool($15) == "0" ) { next; } + if ( validBool($16) == "0" ) { next; } + if ( validBool($17) == "0" ) { next; } + if ( validBool($19) == "0" ) { next; } + if ( validBool($21) == "0" ) { next; } + if ( validBool($22) == "0" ) { next; } + if ( validBool($23) == "0" ) { next; } + } + print trim($0) +} diff --git a/awk/06-aufgabe.sh b/awk/06-aufgabe.sh new file mode 100755 index 0000000..0b2bb6e --- /dev/null +++ b/awk/06-aufgabe.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cat ../csv/credit_master.csv | sed 's/"//g' | awk -F "," -f 06-aufgabe.awk > ../csv/credit_master_cleaned.csv \ No newline at end of file diff --git a/awk/07-aufgabe.awk b/awk/07-aufgabe.awk new file mode 100644 index 0000000..3708094 --- /dev/null +++ b/awk/07-aufgabe.awk @@ -0,0 +1,76 @@ +#!/bin/awk + +BEGIN{ + print "-- PostgreSQL-Statements generated by awk" + + print ""; + + print "CREATE TABLE IF NOT EXISTS credit_master (" + print " lfdnr INTEGER PRIMARY KEY,"; + print " kreditbe NUMERIC(11,2) NOT NULL,"; + print " rsv BOOLEAN NOT NULL,"; + print " geschlec BOOLEAN NOT NULL,"; + print " age NUMERIC(2) NOT NULL,"; + print " telefon BOOLEAN NOT NULL,"; + print " kinderza NUMERIC(2) NOT NULL,"; + print " anschrif BOOLEAN NOT NULL,"; + print " buerge BOOLEAN NOT NULL,"; + print " arbeitsd NUMERIC(2) NOT NULL,"; + print " einkomme NUMERIC(7,2) NOT NULL,"; + print " verfeink NUMERIC(7,2) NOT NULL,"; + print " miete NUMERIC(7,2) NOT NULL,"; + print " pkw BOOLEAN NOT NULL,"; + print " vertraeg BOOLEAN NOT NULL,"; + print " kredit BOOLEAN NOT NULL,"; + print " ausgaben NUMERIC(7,2) NOT NULL,"; + print " kunde BOOLEAN NOT NULL,"; + print " dauerkun INTEGER NOT NULL,"; + print " sparguth BOOLEAN NOT NULL,"; + print " wertpapi BOOLEAN NOT NULL,"; + print " rueckzah BOOLEAN NOT NULL"; + print ");"; + + print ""; + + print "INSERT INTO credit_master ("; + print " lfdnr,"; + print " kreditbe,"; + print " rsv,"; + print " geschlec,"; + print " age,"; + print " telefon,"; + print " kinderza,"; + print " anschrif,"; + print " buerge,"; + print " arbeitsd,"; + print " einkomme,"; + print " verfeink,"; + print " miete,"; + print " pkw,"; + print " vertraeg,"; + print " kredit,"; + print " ausgaben,"; + print " kunde,"; + print " dauerkun,"; + print " sparguth,"; + print " wertpapi,"; + print " rueckzah"; + print ") VALUES"; +} + +FNR > 1 { + $4 == "ja" ? $4 = "'1'" : $4 = "'0'"; # RSV + $5 == "männlich" ? $5 = "'1'" : $5 = "'0'"; # geschlec + $7 == "ja" ? $7 = "'1'" : $7 = "'0'"; # telefon + $9 == "ja" ? $9 = "'1'" : $9 = "'0'"; # anschrif + $10 == "ja" ? $10 = "'1'" : $10 = "'0'"; # buerge + $15 == "ja" ? $15 = "'1'" : $15 = "'0'"; # pkw + $16 == "ja" ? $16 = "'1'" : $16 = "'0'"; # vertrag + $17 == "ja" ? $17 = "'1'" : $17 = "'0'"; # kredit + $19 == "ja" ? $19 = "'1'" : $19 = "'0'"; # kunde + $21 == "ja" ? $21 = "'1'" : $21 = "'0'"; # sparguth + $22 == "ja" ? $22 = "'1'" : $22 = "'0'"; # wertpapi + $23 == "ja" ? $23 = "'1'" : $23 = "'0'"; # rueckzah + + printf "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s),\n", $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23; +} \ No newline at end of file diff --git a/awk/07-aufgabe.sh b/awk/07-aufgabe.sh new file mode 100755 index 0000000..6239f3b --- /dev/null +++ b/awk/07-aufgabe.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cat ../csv/credit_master_cleaned.csv | awk -F "," -f 07-aufgabe.awk > ../sql/credit_master_cleaned.sql \ No newline at end of file diff --git a/chapters/01-ssh.tex b/chapters/01-ssh.tex new file mode 100644 index 0000000..7016f8b --- /dev/null +++ b/chapters/01-ssh.tex @@ -0,0 +1,201 @@ +% <#>-----------------------------------------------------------------------<#> +\section{SSH}% +\label{sec:ssh} + +Genau so wie eine Anmeldung am Linux-Rechner über ein Terminal (\textit{tty}), +ist auch die Anmeldung eines Benutzers über das Netzwerk möglich. Das gleichnamige Programm und Protokoll \acrfull{acr:telnet} wurde durch das gleichnamige Programm und Protokoll \acrfull{acr:ssh} in laufe der Zeit ersetzt. + +Beim ersten Implementierung \acrshort{acr:ssh} von wird eine unverschlüsselte +Verbindung zwischen den beteiligten Rechnern aufgebaut und die Identifizierung +des Benutzers erfolgt nur durch dessen Namen und Passwort. Beim der zweiten +Implementierung von \acrshort{acr:ssh}, wird eine verschlüsselte Verbindung +aufgebaut, die sowohl das Abhören der Login-Daten, also auch der später +gesendeten Daten nahezu unmöglich macht. Es wird sowohl ein rechnerspezifischer +Schlüssel als auch ein benutzerspezifischer Schlüssel verwendet. Zu Testzwecken +ist natürlich auch eine Verbindung zu dem eigenen Rechner (localhost) möglich. + +% #>------------------------------------------------------------------------<# +\subsection{Relevante Befehle für die weiteren Übungen}% +\label{sec:ssh.relevante_befehle_fuer_die_weiteren_uebungen} + +\begin{itemize}[label={},itemsep=0pt] + \item \textit{ssh:} Stellt eine verschlüsselte Verbindung zwischen zwei + Rechnern her, über die neben der Shell auch andere Programme der + \acrshort{acr:gui} angesprochen werden können. + \item \textit{scp:} Ermöglicht das bidirektionale kopieren von Dateien und Verzeichnissen zwischen zwei Rechnern über eine \acrshort{acr:ssh}-Verbindung. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Relevante Konfigurationsdateien}% +\label{sec:ssh.relevante_konfigurationsdateien} + +\begin{itemize}[label={}] + \item \textit{/etc/ssh/sshd\_config:} Konfigurationsdatei des + \acrshort{acr:ssh}-Servers. + \item \textit{/etc/ssh/ssh\_config:} Systemweite \acrshort{acr:ssh}-Client Konfiguration. + \item \textit{\textasciitilde/.ssh:} Enthält Benutzerspezifische \acrshort{acr:ssh}-Client Konfigurationen und Metainformationen. +\end{itemize} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 2a:} Erkundigen Sie sich nach ihren + \acrshort{acr:ssh}-Zugangsdaten der Hochschule Trier. + \item \textbf{Aufgabe 2b:} Melden Sie sich mit ihren + \acrshort{acr:ssh}-Zugangsdaten per \acrshort{acr:ssh} an dem Rechner + \textit{ssh.hochschule-trier.de} an. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Authentifizierungsverfahren}% +\label{sec:ssh.authentifizierungsverfahren} + +Bei \acrshort{acr:ssh} werden asymetrische Verschlüsselungsverfahren (Public-Key +Verfahren) eingesetzt. Wie Sie bei der ersten Verbindung bereits festgestellt +haben, werden die SSH-Server durch ein Schlüsselpaar identifiziert (\textit{Sie +mussten den öffentlichen Schlüssel des Servers bei der ersten Verbindung +akzeptieren}). In einer Umgebung mit erhöhtem Sicherheitsbedarf würde man den +angezeigten Fingerabdruck des Schlüssels mit einem vorher über einen anderen +Kanal übermittelten Fingerabdruck vergleichen, um eine sichere Verbindung zu +einem gefälschten Server zu vermeiden. + +Die akzeptierten öffentlichen Schlüssel des Servers werden zur Abwehr von +Man-in-the-Middle Attacken in der Datei \textit{known\_hosts} gespeichert. Diese +befindet sich im Unterverzeichnis \textit{.ssh} des Heimatverzeichnis des +Benutzers. + +Solange der private Schlüssel nicht abhanden kommt und auf dritten Server +repliziert und konfiguriert wird, ist bei der aktuellen Protokollversion 2 keine +umbemerkte Man-in-the-Middle Attacke möglich. Passt der auf dem Client +gespeicherte öffentliche Schlüssel nicht zu dem öffentlichen Schlüssel, den der +Server beim Verbindungsaufbau übermittelt, wird der weitere Verbindungsaufbau +mit einer entsprechenden Warnung abgebrochen. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 3a:} Nachdem Sie sich das erste mal per \textit{ssh} mit + dem \acrshort{acr:ssh}-Server der Hochschule Trier erfolgreich verbunden + haben. Überprüfen Sie die Dateiberechtigungen für den Ordner + \textit{\textasciitilde/.ssh} auf ihrer lokalen VM. Was fällt Ihnen in Vergleich zu anderen Verzeichnissen auf? +\end{itemize} + +Bisher melden Sie sich an ihrem virtuellen Server oder den der Hochschule Trier +mit Benutzername und Passwort an. Die Daten werden zwar verschlüsselt übertragen +und können daher auch nicht abgehört werden, aber ein Angreifer kann beliebig +viele Passwörter per Brute-Force-Attacke an ihrem oder dem Server der Hochschule +Trier ausprobieren. Bei schwachen Passwörtern wird es daher nicht allzu lange +dauern, bis ein ernsthafter Angreifer erfolg hat. Bei einer frisch in Betrieb +genommenen virtuellen Maschine in einem Rechenzentrum dauert es meist nur wenige +Stunden, bis der erste derartige Angriff erfolgt! Daher sollte man so schnell +wie möglich auf ein besseres Verfahren umstellen. + +Ähnlich wie die Authentifizierung der Rechner kann auch die Authentifizierung +der Benutzer per Public-Key Verfahren konfiguriert werden. Der Benutzer, der +sich unter einem entfernten Benutzer anmelden möchte, muss auf seinem lokalen +Rechner ein Schlüsselpaar generieren und den öffentlichen Schlüssel im +Heimatverzeichnis des entfernt liegenden Benutzer hinzufügen. Bei einem späteren +Login wir dann mit Hilfe des privaten Schlüssels des Client festgestellt, +dass der Anfragende tatsächlich der berechtigte Benutzer ist. + +Die Schlüssel werden ebenfalls im Verzeichnis \textit{\textasciitilde/.ssh} +gespeichert. Ändert man bei der Erzeugung des Schlüsselpaares den dazugehörigen +Dateinamen, muss dieser bei jeder Verwendung angegeben werden! Alternativ kann +auch die Konfigurationsdatei \textit{\textasciitilde/.ssh/config} erstellt +werden, um dort den zugehörigen Schlüssel explizit anzugeben. Das Schlüsselpaar +kann optional mit einer Passphrase (Passwort) gesichert werden, falls man jedoch +automatische Logins z.B. für Backups wünscht, sollte man auf diese zusätzliche +Sicherung verzichten. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 3b:} Generieren Sie für ihren lokalen Benutzer eine + Schlüsselpaar mit dem \textit{ed25519} Algorithmus. Der Befehl \textit{ssh-keygen} + erzeugt Schlüsselpaare. Informieren Sie sich über \textit{ssh-keygen} per \textit{man ssh-keygen}. + \item \textbf{Aufgabe 3c:} Ermitteln Sie mit Hilfe der man-page via + \textit{man ssh-keygen} den Namen der Datei, in der der öffentliche Schlüssel + auf dem entfernten Rechner hinterlegt werden muss. + \item \textbf{Aufgabe 3d:} Mit dem Befehl \textit{scp} können Dateien über ein + \acrshort{acr:ssh}-Tunnel von einem Rechner zu einem anderen kopiert werden. + Die Syntax lautet: \textit{scp quelle ziel}. Beide Adressen enthalten einen + Pfad an dem die Ressourcen zu finden bzw. zu kopieren sind. Nur die entfernte + Adresse benötigt zusätzlich noch weitere Informationen wie Benutzername und + Rechnername bzw. IP des entfernten Systems. Die Adresse würde folgendem Schema + entsprechen \textit{user@rechner:pfad}. Kopieren Sie mit Hilfe von + \textit{scp} ihren öffentlichen Schlüssel in das Heimatverzeichnis ihres + entfernten Benutzers. + \item \textbf{Aufgabe 3e:} Der kopierte Schlüssel auf dem entfernten System + muss der Datei aus Aufgabe 3c hinzugefügt werden. + \item \textbf{Aufgabe 3f:} Nachdem der öffentliche Schlüssel erfolgreich + kopiert und konfiguriert wurde, öffnen Sie eine zweite + \acrshort{acr:ssh}-Verbindung ohne Eingabe des Passworts. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Absicherung des SSH-Servers}% +\label{sec:ssh.absicherung_des_ssh-servers} + +Nachdem die Authentifizierung mit dem Public-Key-Verfahren erfolgreich getestet +wurde, kann im nächsten Schritt die unsichere Passwort-Authentifizierung auf dem +Server abgeschaltet werden. Dabei ist zu beachten, dass bei einem Neustart des +\acrshort{acr:ssh}-Servers bestehende Verbindungen gehalten werden. Vor dem +Logout sollte daher nach einer Konfigurationsänderung immer getestet werden, ob +der Login noch möglich ist. Falls man sich bei dieser Gelegenheit selbst vom +Server aussperrt, sind "Helping Hands" vom Provider meist nicht billig zu haben. + +\begin{info-popup} + Dies ist für den Server \textit{ssh.hochschule-trier.de} nicht möglich, mangels + Berechtigungen. Führen Sie daher die Abschaltung an ihrem lokalen \acrshort{acr:ssh}-Server + durch. +\end{info-popup} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 4a:} Wie heißt der Eintrag in der Konfigurationsdatei + des Server, mit dem der Zugang für den Benutzer \textit{root} eingestellt + werden kann? Genaueres Betrachten der Konfigurationsdatei sollte schon zum + Ergebnis führen. + \item \textbf{Aufgabe 4b:} Stellen Sie diesen Eintrag so ein, dass für + \textit{root} nur noch der Zugang per Public-Key-Authentifizierung möglich + ist. Lesen Sie die Dokumentation für weitere Informationen. + \item \textbf{Aufgabe 4c:} Mit welchem Konfigurationswert kann das Verhalten + aus Aufgabe 4b auch für normale Benutzer erreicht werden? Informieren Sie sich + auch hier über die Dokumentation. + \item \textbf{Aufgabe 4d:} Stellen Sie das Verhalten so ein, dass für normale + Benutzer nur noch Zugang per Public-Key-Authentifizierung möglich ist. + \item \textbf{Aufgabe 4e:} Nach dem Speichern dieser Änderungen muss der + \acrshort{acr:ssh}-Dienst mit \textit{systemctl restart ssh} neu gestartet werden + \item \textbf{Aufgabe 4f:} Testen Sie die korrekte Funktionsfähigkeit dieser + Änderung mir einer zweiten \acrshort{acr:ssh}-Verbindung. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Client-Konfiguration}% +\label{sec:ssh.client-konfiguration} + +Da Sie nun den Server erfolgreich auf Public-Key-Authentifizierung umgestellt +haben, kann im nächsten Schritt die \acrshort{acr:ssh}-Client Konfiguration +angepasst werden. Dazu ist die Datei \textit{\textasciitilde/.ssh/config} +notwendig. Der \acrshort{acr:ssh}-Client liest die Datei ein und setzt die +Konfiguration, welcher für den Verbindungsaufbau notwendig ist, rekursiv +abhängig von dem DNS-Namen, zusammen. + +Möchte man Beispielsweise eine Verbindung zu \textit{verwaltung.example.local} +aufbauen. Werden zuerst alle Konfigurationsoptionen, welche für +\textit{verwaltung.example.local} definiert wurden, angewendet. Als nächstes +sucht der \acrshort{acr:ssh}-Client nach Konfigurationsoptionen, welche für +\textit{*.example.local} definiert wurden, anschließend für \textit{*.local} und +zum Schluss für \textit{*}. Konfigurationsoptionen, welche einmal definiert +wurden, können nicht mehr durch andere Optionen, welche in einem höhren +Scope definiert wurden, übersteuert werden. + +\begin{itemize}[label={}] + \item \textbf{Aufgabe 5a:} Erstellen Sie die Datei + \textit{\textasciitilde/.ssh/config} und setzen Sie die entsprechenden + Berechtigungen. + \item \textbf{Aufgabe 5b:} Erstellen Sie einen Eintrag in der Konfiguration + für alle Verbindungen. Definieren Sie dort, welcher Schlüssel zur + Authentifizierung verwendet werden soll. + \item \textbf{Aufgabe 5c:} Erstellen Sie einen Eintrag in der Konfiguration + für alle Verbindungen, welche gegen die Domain \textit{*.hochschule-trier.de} + aufgebaut werden. Für die Domain \textit{*.hochschule-trier.de} soll der Port + 22 verwendet werden. Die Authentifizierung per Passwort und der Verbindungsaufbau + über IPv6 soll nicht verwendet werden. + \item \textbf{Aufgabe 5d:} Erstellen Sie einen Eintrag in der Konfiguration + für die Verbindung \textit{ssh.hochschule-trier.de}. Geben Sie dort den + Benutzernamen an unter welchen Sie sich anmelden möchten. +\end{itemize} \ No newline at end of file diff --git a/chapters/02-dns.tex b/chapters/02-dns.tex new file mode 100644 index 0000000..a3e3ae6 --- /dev/null +++ b/chapters/02-dns.tex @@ -0,0 +1,208 @@ +% <#>-----------------------------------------------------------------------<#> +\section{DNS}% +\label{sec:dns} + +% #>------------------------------------------------------------------------<# +\subsection{Aufbau des DNS}% +\label{sec:dns.aufbau} + +Die Adressierung der Rechner in IP-basierten Netzen erfolgt über die IP-Adresse +des angesprochenen Rechners. Da der Mensch sich Nummernfolgen schlecht merken +kann, wurde schon früh eine Ersetzung der Nummern durch Namen auf der +Benutzerschnittstelle eingeführt. Die ursprüngliche Zuordnungsmethode wird auch +heute noch in kleinen Netzen angewendet: jeder Rechner im Netz verfügt über eine +Datei mit zuordnungen von Namen zu Nummern. Unter Unix-artigen Betriebssystemen +ist dies die Datei \textit{/etc/hosts}. + +\begin{verbatim} +127.0.0.1 localdomain.localhost localhost +::1 localdomain.localhost localhost +\end{verbatim} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 1a:} Überprüfen Sie ihre \textit{hosts} Datei, ob dort + abweichende Zuordungen zu der obrigen Ausgabe definiert sind + \item \textbf{Aufgabe 1b:} Welche Website wird ihnen im Browser dargestellt, + wenn Sie den folgenden Eintrag in die Datei \textit{hosts} aufnehmen und per + Browser die Seite \textit{hello-world.local} aufrufen? \texttt{198.145.29.83 + hello-world.local} + \item \textbf{Aufgabe 1b:} In welchem Pfad findet man die entsprechende Datei + in Windows Systemen? +\end{itemize} + +Dieses Verfahren der Namensauflösung führt in großen Netzwerken schnell zu +Problemen. Alle beteiligten Rechner benötigen in ihrer Version der Datei die +Zuordnungen aller Rechner, was die zentrale Verwaltung der Zuordnungen schnell +sehr aufwändig macht. Als Folge dieser Erkenntnis wurde das \acrfull{acr:dns} +entwickelt, das eine verteile Datenbank darstellt, bei der einzelne Server für +genau beschriebene Teilbereiche verantwortlich sind. + +Den Namensraum im Internet ist hierarchisch gegliedert, ausgehend von der +höchsten Ebene, den sog. \acrfullpl{acr:tld}, können viele untergeordnete Ebenen +(Domains) eingefügt werden. Da die Internet-Entwicklung in den USA begann, +teilten die ersten \acrshortpl{acr:tld} den amerikanischen Netzbereich auf (z.B. +com, edu und org). Später kamen dann weitere \acrshortpl{acr:tld} für jedes Land +hinzu, die den genormten Länderkürzeln entprechen (ISO 3166), beispielsweise be, +de, nl usw. In der jüngsten Entwicklung wurden weitere allgemeine +\acrshortpl{acr:tld} hinzugefügt. Beispielsweise info, firm, museum, movie und +berlin. + +Bei Domänennamen wird die Groß- und Kleinschreibung nicht beachtet, \textbf{edu} +und \textbf{EDU} bedeuten das gleiche. Einzelne Teil-Domainnamen dürfen maximal +63 Zeichen lang sein, der vollständige Domainname, \acrfull{acr:fqdn}, darf +nicht länger als 255 Zeichen sein. Für die Genehmigung eines neuen Domainnamens +ist die Verwaltung der nächst höheren Domain zuständig, für die Root-Zone und +damit die \acrshortpl{acr:tld} ist dies die \acrfull{acr:icann}. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 2a:} Für welche Verwaltungsmaßnahmen ist die + \acrshort{acr:icann} verantwortlich? Nutzen Sie die Internetpräsenz der + \acrshort{acr:icann}, um die Frage zu beantworten. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Betrieb einer Domain}% +\label{sec:dns.betrieb_einer_domain} + +Für jede offiziell registrierte Domain müssen mindestens zwei DNS-Server +eingerichtet werden, die in unterschiedlichen Subnetzen stehen müssen. Einer +dieser Server wird dann als Primary, der andere als Replica betrieben. +Änderungen müssen dann nur noch am Primary vorgenommen werden, der oder die +Replicas werden durch den Primary über die Änderungen informiert, worauf ein +Zonentransfer der Daten vom Replica veranlast wird. + +Sucht ein Rechner die IP-Nummer zu einem Namen, wird er zuest den DNS-Server, +der voreingestellt ist, befragen. Dies ist meist der Server der eigenen Domain +bzw. des eigenen Providers. Für Heimnetzwerke stellt beispielsweise der Router +einen DNS-Server bereit. Hat dieser Server den gewünschten Datensatz in seiner +Datenbank, so kann er die Anfrage sofort beantworten (Authorative Answer). Ist +der Datensatz nicht vorhanden, kann je nach Konfiguration ein Server aus einer +höheren Ebene befragt werden, der dann den zuständigen Server kennt oder +seinerseits die Anfrage wieder nach oben weiterreicht. Der Server kann jedoch +auch als Antwort dem Client mitteilen, welchen Server er fragen soll, um seine +Anfrage zu beantworten. Jeder DNS-Server muss mindestens die DNS-Server seiner +direkt untergeordneten Domains kennen, um Anfragen hierfür weiterreichen zu +können und er muss die Adressen aller Root-Server kennen. + +Für die Verwaltung des Namesraums wird dieser in Zonen aufgeteilt. Ein +DNS-Server kann für eine oder mehrere DNS-Zonen verantwortlich sein. Es gibt +üblicherweise Zonen für die Vorwärtsauflösung (Forward Lookup) und +Rückwärtsauflösung (Reverse Lookup). Vorwärtsauflösung bedeutet, dass für einen +gegebenen Rechnernamen eine IP-Adresse gesucht wird. Rückwärtsauflösung bedeutet +dementsprechend, dass für eine gegebene IP-Adresse ein Rechnername gesucht wird. +Für jede Zone werden die Informationen als sogenannte \acrfullpl{acr:rr} +gespeichert. Dies sind die gängigen \acrshortpl{acr:rr}: + +\begin{itemize}[itemsep=0pt] + \item[\textbf{\acrshort{acr:soa}}] \acrfull{acr:soa} markiert den Start einer + DNS-Zone mit verschiedenen allgemeinen Informationen + \item[\textbf{A}] Enthält die IPv4-Adresse zu einem gegebenen Rechnernamen + \item[\textbf{AAAA}] Enthält die IPv6-Adresse zu einem gegebenen Rechnernamen + \item[\textbf{NS}] Enthält den Rechnernamen eines für die Domain + verantwortlichen DNS-Servers. Darf nicht auf einen \textit{CNAME} Eintrag + verweisen! + \item[\textbf{MX}] Enthält die Prioritätsangabe und den Rechnernamen eines + zuständigen Mailservers. Darf nicht auf einen \textit{CNAME} Eintrag + verweisen! + \item[\textbf{PTR}] Enthält den Rechnernamen zu einer gegebenen IP-Adresse + (IPv4 oder IPv6) + \item[\textbf{SSHFP}] Enthält den Fingerabdruck des privaten SSH-Schlüssels, + welcher auf dem jeweiligen Rechner beim Verbindungsaufbau abgefragt und + überprüft wird. Ein Vergleich der Fingerabdrücke aus dem DNS mit dem, welcher + der entfernte Server anbietet, deckt so einen möglichen Man-in-Middle Angriff + auf. +\end{itemize} + +Clientseitig können die Programme \textbf{dig}, \textbf{resolvectl}, +\textbf{nslookup} und \textbf{host} zur Abfrage verwendet werden. Diese Abfragen +werden normalerweise über das Transportprotokoll UDP abgewickelt und sind an den +Port 53 gerichtet. + +Lesen Sie die Dokumentation eines der oben genannten Programme oder informieren +Sie sich im Internet, um folgende Fragen zu beantworten: + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 2a:} Wann wird bei DNS das Transportprotokoll TCP eingesetzt? + \item \textbf{Aufgabe 2b:} Fragen Sie mit Hilfe eines der oben genannten + Programme den \acrshort{acr:rr} \textit{SSHFP} der Domain + \textit{pontos.cryptic.systems} ab. Welche Informationen werden zurück + gegeben? + \item \textbf{Aufgabe 2c:} Welche DNS-Server sind für die DNS-Zone + \textit{cryptic.systems} verantwortlich? + \item \textbf{Aufgabe 2c:} Welcher der DNS-Server ist für die Zone + \textit{cryptic.systems} der Primary und welcher der Replica DNS-Server? + \item \textbf{Aufgabe 2d:} Welche Mail-Server sind für die Zone + \textit{cryptic.systems} verantwortlich? + \item \textbf{Aufgabe 2e:} Welcher Mail-Server wird zur Zustellung von E-Mails + für die DNS-Zone \textit{cryptic.systems} privorisiert? + \item \textbf{Aufgabe 2f:} Welcher DNS-Name steht hinter der IP-Adresse + \textit{45.9.61.170}? +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Konfiguration des Clients}% +\label{sec:dns.konfiguration_des_clients} + +Für die Namensauflösung auf der Seite des Clients ist der \textbf{Resolver} +verantwortlich, welcher von den Anwendungsprogrammen bei Bedarf automatisch +aufgerufen wird. Die Konfiguration erfolgt in Unix-Systemen über die Datei +\textit{/etc/resolv.conf}. Die wichtigsten Einträge in dieser Datei sind +\textit{domain} und \textit{nameserver}. + +Immer seltener muss die Datei \textit{/etc/resolv.conf} manuell gepflegt werden. +Programme bzw. Dienste wie Beispielsweise der \textit{network-manager} oder +\textit{systemd-resolved} erstellen die Datei automatisch anhand der +Informationen, welche Sie per DHCP erhalten haben. Ändert man direkt den Inhalt +der Datei, kann dies dazu führen, dass das Programm oder der Dienst die +Einstellungen wieder überschreibt. Dem Programm bzw. dem Dienst muss daher +direkt mitgeteilt werden, welchen DNS-Server bzw. Domain der Rechner angehört, +um ein überschreiben zu vermeiden. + +Mit dem Eintrag \textit{domain} wird festgelegt, welcher Domainname +standardmäßig an unvollständige Namen angehängt wird, bevor die Anfrage +abgesendet wird. Als unvollständig werden in der Regel Namen betrachtet, die +keinen Punkt enthalten. Es kann hier eine Liste mehrere Domainnamen angegeben +werden. + +Mit dem Eintrag \textit{nameserver} wird angegeben, welcher DNS-Server für eine +Anfrage angesprochen wird. Zu Erhöhung der Redundanz ist es möglich, mehrere +Einträge dieser Art vorzunehmen. Ist der erste DNS-Server nicht erreichbar, wird +der nächste aus der Liste gefragt. + +Die Datei \textit{/etc/nsswitch.conf} ist eine weitere Konfigurationsdatei aus +dem Bereich der Namensauflösung, in der eingestellt wird, in welcher Reihenfolge +interne und externe Quellen für die Namensauflösung verwendet werden. Wenn +folgende Zeile enthalten ist, wird zuerst in der lokalen Datei +\textit{/etc/hosts} gesucht. Wird dort kein passender Eintrag gefunden, wird das +DNS abfragt. + +\begin{verbatim} + hosts: files dns +\end{verbatim} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 3a:} In Kapitel \ref{sec:network} haben Sie erfolgreich + \textit{systemd-networkd} konfiguriert. Passen Sie ihre Konfiguration so an, + dass primär der DNS-Server \textit{8.8.8.8} und sekundär der DNS-Server + \textit{8.8.4.4} für ihren Netzwerkadapter verwendet wird. + \item \textbf{Aufgabe 3b:} Überprüfen Sie die Konfiguration mit dem Aufruf von + \textit{resolvectl}. Beide DNS-Server sollten unter Ihrem Netzwerkadapter + gelistet und zusätzlich in der Datei \textit{/etc/resolv.conf} aufgeführt + sein. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Einstellen des Rechnernamens}% +\label{sec:dns.einstellen_des_rechnernamens} + +Der Rechnername ist in der Datei \textit{/etc/hostname} gespeichert. Nach +Änderung der Datei ist es sinnvoll, den Rechner neu zu starten, um die Änderung +allen Diensten bekannt zu machen. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 4a:} Ändern Sie den Rechnernamen ab und starten Sie das System neu + \item \textbf{Aufgabe 4b:} Nutzen Sie eines der Programme zur Namensauflösung, + um die IP-Adresse ihres Rechners anhand des neuen Rechnernamens durch den im + lokalen Netzwerk befindlichen DNS-Server auflösen zu lassen. Überprüfen Sie, + ob die IP-Adresse mit der IP-Adresse ihrer Netzwerkkarte übereinstimmt. +\end{itemize} \ No newline at end of file diff --git a/chapters/03-network.tex b/chapters/03-network.tex new file mode 100644 index 0000000..0fb98ac --- /dev/null +++ b/chapters/03-network.tex @@ -0,0 +1,274 @@ +% <#>-----------------------------------------------------------------------<#> +\section{Netzwerk}% +\label{sec:network} + +% #>------------------------------------------------------------------------<# +\subsection{Netzwerkkonfiguration}% +\label{sec:netzwerk.konfiguration} + +Bei der Installation des Basis-Systems (Fedora Server Edition) wird das Paket +\textbf{network-manager} installiert. Dieses Paket ist für die einfache und +weitgehend automatische Netzwerk-Konfiguration auf Endbenutzer-Systemen +entwickelt worden. Daher ist es auf Serversystemen, bei denen eine statische +Adressvergabe oder es zu komplexen Netzwerkstrukturen kommen kann, +kontraproduktiv. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 1a:} Stellen Sie mit dem Befehl \textit{yum list + installed} fest, ob das Paket mit dem Namensbestandteil + \textbf{network-manager} installiert ist. + \item \textbf{Aufgabe 1b:} Falls Sie hierbei fündig geworden sind, stoppen und + deaktivieren Sie den Dienst \textit{NetworkManager} per \textit{systemctl} und + \dots + \item \textbf{Aufgabe 1c:} überprüfen Sie mithilfe von \textit{systemctl}, ob + der Dienst \textit{NetworkManager} gestoppt und deaktiviert ist. +\end{itemize} + +Nachdem Sie den Dienst \textit{NetworkManager} entfernt haben, stellen Sie +mithilfe von \textit{systemd} die Netzwerkkonfiguration ein und erstellen ggfl. +notwendige virtuelle Netzwerkkarten. \textit{systemd} unterteilt die +Netzwerkkonfiguration in drei unterschiedliche Dienste: + +\begin{itemize}[label={},itemsep=0pt] + \item \textit{systemd-networkd:} Erstellt virtuelle Netzwerkkarten und richtet + diese als auch physische ein. Dadurch ist die Zuweisung einer dynamischen per + \acrshort{acr:dhcp} oder statischen IP-Adresse möglich. + \item \textit{systemd-resolved:} Kümmert sich um die Namensauflösung per + \acrshort{acr:dns}. + \item \textit{systemd-timesyncd:} Richtet die Uhrzeit mithilfe des + \acrfull{acr:ntp} auf dem System ein. +\end{itemize} + +Die Dienste \textit{systemd-resolved} und \textit{systemd-timesyncd} rufen +notwendige Informationen von anderen Diensten auf dem System ab. Ein anpassen +des Standardverhaltens ist hier nicht notwendig. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 1d:} Starten und aktivieren Sie die beiden Dienste + mithilfe des Befehls \textit{systemctl}. + \item \textbf{Aufgabe 1e:} Überprüfen Sie, ob die Dienste als \textit{active + (running)} markiert sind. + \item \textbf{Aufgabe 1f:} Zusätzlich überprüfen Sie, ob die Dienste auch als + \textit{enabled} markiert sind, sodass diese bei einem erneusten Systemstart + ausgeführt werden. +\end{itemize} + +Die Netzwerkkonfiguration per \textit{systemd} wird über die unterschiedlichen +Dateiendungen \textit{.netdev} und \textit{.network} im Verzeichnis +\textit{/etc/systemd/network} geregelt. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 1g:} Rufen Sie die Dokumentation von + \href{https://www.freedesktop.org/software/systemd/man/systemd.network.html}{systemd.network} + und + \href{https://www.freedesktop.org/software/systemd/man/systemd.netdev.html}{systemd.netdev} + auf und erklären Sie den Unterschied der beiden Konfigurationsdateien + \textit{.netdev} und \textit{.network}. +\end{itemize} + +Mit dem Befehl \textit{ip link show} werden alle Netzwerkkarten, welches Ihr +System kennt ausgegeben. + +\begin{bashcode} +$ ip link show +1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 +2: enp1s0: mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000 + link/ether 52:54:00:b3:95:e4 brd ff:ff:ff:ff:ff:ff +\end{bashcode} + +Das System, auf dem der Befehl ausgeführt wurde, kennt zwei Netzwerkadapter. Mit +dem Index 1 ist das \textit{loopback device} \textbf{lo} aufgeführt. Über das +\textit{loopback device} können Dienste, welche auf dem lokalen System +ausgeführt werden, per Netzwerk sich selbst oder andere Dienste adressieren bzw. +zugreifen. Dies ist durch die IP-Adresse \textit{127.0.0.1} oder den DNS-Namen +\textit{localhost} möglich. + +Vorteil des \textit{loopback device} ist es, dass die Netzwerkpakete nicht den +Rechner verlassen. Dadurch wird unnötiger Netzwerkverkehr, welcher über das +physische Netzwerk geleitet wird, vermieden. + +Mit dem Index 2 wird der Netzwerkadapter \textbf{enp1s0} geführt. Dieser besitzt +die MAC-Adresse \textit{52:54:00:b3:95:e4}. Der Netzwerkadapter ist als inaktiv +bzw. ausgeschaltet markiert. Dies kann durch die Information \textit{state DOWN} +entnommen werden. Dieser ist nicht konfiguriert und besitzt auch keine +IP-Adresse. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 1h:} Ermitteln Sie ihren Netzwerkadapter, welcher nicht + konfiguriert wurde. Überprüfen Sie mit dem Befehl \textit{ip address show}, ob + ihr Netzwerkadapter eine IP-Adresse zugewiesen wurde. + \item \textbf{Aufgabe 1i:} Schauen Sie sich in der Dokumentation zu + \href{https://www.freedesktop.org/software/systemd/man/systemd.network.html}{systemd.network} + die Beispielkonfigurationen an und erstellen Sie für ihren Netzwerkadapter + eine passende Konfiguration. + + Falls Sie die Konfiguration ihres lokalen Netzwerks nicht kennen, um ihrem + System eine statische IP-Adresse zu zuweisen, verwenden Sie + \acrshort{acr:dhcp}. + \item \textbf{Aufgabe 1j:} Starten und aktivieren Sie den Dienst + \textit{systemd-networkd} mithilfe von \textit{systemctl}. + \item \textbf{Aufgabe 1k:} Überprüfen Sie, ob der Dienst als \textit{active + (running)} markiert ist und \dots + \item \textbf{Aufgabe 1l:} ob dieser als \textit{enabled} markiert ist. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Routing}% +\label{sec:netzwerk.routing} + +Das \acrfull{acr:ip} ist auf Schicht 3 des OSI-Modells angesiedelt. Es dient der +Strukturierung von großen Netzwerken, d.h der Aufteilung dieser Netze in +übersichtliche Teilnetze und der Verbindung dieser Teilnetze. \acrshort{acr:ip} +ist für die Vermittlung eines Weges, einer Route, zwischen zwei +Kommunikationspartnern zuständig. Diese Route muss auch über mehrere Teilnetze +hinweg gefunden werden. Die Verbindungspunkte zwischen Netzen werden als Router +oder Gateway bezeichnet. + +Jeder Rechner, auch solche, die keine Routingfunktion haben, muss Informationen +zur Wegefindung im Netz speichern. Dies geschieht bei jedem +\acrshort{acr:ip}-fähigen Betriebssystem in einer Routingtabelle, die statisch +oder dynamisch verwaltet werden kann. In einem Maschennetz wie dem Internet ist +eine dynamische Verwaltung sinnvoll, da so die Wegewahl der aktuellen +Belastungssituation auf den verschiedenen Wegen angepasst werden kann. Auch bei +Ausfall einer Verbindung kann so automatisch eine Ersatzroute konfiguriert +werden. Bei einfachen Netzverbünden ohne Maschenstruktur wird statisches Routing +verwendet, was auch ohne Zusatzsoftware von den üblichen Betriebssystemen +geleistet werden kann. + +% >---------------------------------------------------------------------------< +\subsubsection{Einfache Netze}% +\label{sec:netzwerk.routing.einfache-netze} + +Selbst in \acrshort{acr:ip}-Netzen ohne Anbindung an andere Netze besitzt jeder +Rechner eine statische Routingtabelle in minimaler Größe. Die Tabelle enthält +mehrere Informationen, die wichtigsten sind in den ersten Spalten festgehalten. +Darunter wird das Zielnetzwerk, die verwendete Schnittstelle und das verwendete +Gateway aufgeführt. In diesem einfachsten Fall bleibt die Spalte für das Gateway +leer und es gibt nur einen Eintrag in jeder Tabelle. Diese minimale +Routingtabelle wird bei allen Betriebssystem mit der normalen +Netzwerkkonfiguration automatisch erstellt. + +\begin{table}[H] + \footnotesize + \centering + \begin{tabularx}{17cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}||p{2.6cm}|p{2.6cm}|p{1.9cm}} + \multicolumn{3}{c||}{\textbf{PC}} & \multicolumn{3}{c}{\textbf{Laptop}} \\ + \hline + Zielnetz & Netzwerkadapter & Gateway & Zielnetz & Netzwerkadapter & Gateway \\ + \hline\hline + 192.168.178.0/24 & enp1s0 & - & 192.168.178.0/24 & wlp5s1 & - \\ + \end{tabularx} +\end{table} + +\begin{table}[H] + \footnotesize + \centering + \begin{tabularx}{8.5cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}} + \multicolumn{3}{c}{\textbf{Server A}} \\ + \hline + Zielnetz & Netzwerkadapter & Gateway \\ + \hline\hline + 192.168.178.0/24 & eth0 & - \\ + \end{tabularx} +\end{table} + +\begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/einfache-netze.png} +\end{figure} + +% >---------------------------------------------------------------------------< +\subsubsection{Einfache Netze mit Internetanbindung}% +\label{sec:netzwerk.routing.einfache-netze-mit-internetanbindung} + +Hat ein Netzwerk genau eine Anbindung an die anderen Netzwerke, erhält die +Routingtabelle auf jedem Rechner eine zusätzliche Zeile, in der angegeben wird, +auf welchem Weg die anderen Netzwerke erreicht werden können. Da alle Netzwerke +über den gleichen ersten Router erreicht werden, wird diese Zeile der +Routingtabelle als Standard- bzw. Default-Route bezeichnet. Dieses +Standard-Gateway muss bei allen Betriebssystemen gesondert konfiguriert werden. + +\begin{table}[H] + \footnotesize + \centering + \begin{tabularx}{17cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}||p{2.6cm}|p{2.6cm}|p{1.9cm}} + \multicolumn{3}{c||}{\textbf{PC}} & \multicolumn{3}{c}{\textbf{Laptop}} \\ + \hline + Zielnetz & Netzwerkadapter & Gateway & Zielnetz & Netzwerkadapter & Gateway \\ + \hline\hline + 192.168.178.0/24 & enp1s0 & - & 192.168.178.0/24 & wlp5s1 & - \\ + 0.0.0.0/0 & enp1s0 & 192.168.178.1 & 0.0.0.0/0 & wlp5s1 & 192.168.178.1 \\ + \end{tabularx} +\end{table} + +\begin{table}[H] + \footnotesize + \centering + \begin{tabularx}{8.5cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}} + \multicolumn{3}{c}{\textbf{Server A}} \\ + \hline + Zielnetz & Netzwerkadapter & Gateway \\ + \hline\hline + 192.168.178.0/24 & eth0 & - \\ + 189.10.55.47/32 & ppoe1 & - \\ + 0.0.0.0/0 & ppoe1 & 189.10.55.47 \\ + \end{tabularx} +\end{table} + +\begin{figure}[H] + \centering + \includegraphics[width=1\textwidth]{img/einfache-netze-mit-internetanbindung.png} +\end{figure} + +% >---------------------------------------------------------------------------< +\subsubsection{Zwei Netze mit Internetanbindung}% +\label{sec:netzwerk.routing.zwei-netze-mit-internetanbindung} + +\begin{table}[H] + \footnotesize + \centering + \begin{tabularx}{17cm}{p{2.6cm}|p{2.6cm}|p{1.9cm}||p{2.6cm}|p{2.6cm}|p{1.9cm}} + \multicolumn{3}{c||}{\textbf{PC}} & \multicolumn{3}{c}{\textbf{Laptop}} \\ + \hline + Zielnetz & Netzwerkadapter & Gateway & Zielnetz & Netzwerkadapter & Gateway \\ + \hline\hline + 192.168.178.0/24 & enp1s0 & - & 192.168.178.0/24 & wlp5s1 & - \\ + 0.0.0.0/0 & enp1s0 & 192.168.178.1 & 0.0.0.0/0 & wlp5s1 & 192.168.178.1 \\ + \multicolumn{6}{c}{} \\ + \multicolumn{3}{c||}{\textbf{Server A}} & \multicolumn{3}{c}{\textbf{Server B}} \\ + \hline + Zielnetz & Netzwerkadapter & Gateway & Zielnetz & Netzwerkadapter & Gateway \\ + \hline\hline + 192.168.178.0/24 & eth0 & - & 192.168.178.0/24 & eth0 & 192.168.179.1 \\ + 192.168.179.0/24 & eth0 & 192.168.178.4 & 192.168.179.0/24 & eth1 & - \\ + 189.10.55.47/32 & ppoe1 & - & 0.0.0.0/0 & eth0 & 192.168.178.1 \\ + 0.0.0.0/0 & ppoe1 & 189.10.55.47 \\ + \multicolumn{6}{c}{} \\ + \multicolumn{3}{c||}{\textbf{Tablet}} & \multicolumn{3}{c}{\textbf{Smartphone}} \\ + \hline + Zielnetz & Netzwerkadapter & Gateway & Zielnetz & Netzwerkadapter & Gateway \\ + \hline\hline + 192.168.179.0/24 & wlp7s3 & - & 192.168.179.0/24 & wlp3s8 & - \\ + 0.0.0.0/0 & wlp7s3 & 192.168.179.1 & 0.0.0.0/0 & wlp3s8 & 192.168.179.1 \\ + \end{tabularx} +\end{table} + +\begin{figure}[H] + \centering + \includegraphics[width=1\textwidth]{img/zwei-netze-mit-internetanbindung.png} +\end{figure} + +\newpage + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 2b:} Ermitteln Sie mithilfe des Befehls \textit{ip} Ihr + Gateway. + \item \textbf{Aufgabe 2c:} Erstellen Sie anhand des folgenden + Netzwerkdiagramms die Routingtabellen für alle abgebildeten Netzwerkgeräte. +\end{itemize} + +\begin{figure}[H] + \centering + \includegraphics[width=1\textwidth]{img/aufgabe-netze-mit-internetanbindung.png} +\end{figure} diff --git a/chapters/04-file-permissions.tex b/chapters/04-file-permissions.tex new file mode 100644 index 0000000..3b609bd --- /dev/null +++ b/chapters/04-file-permissions.tex @@ -0,0 +1,673 @@ +% <#>-----------------------------------------------------------------------<#> +\section{Benutzer, Gruppen und Dateiberechtigungen}% +\label{sec:benutzer-gruppen-und-berechtigungen} + +Die Verwaltung von Benutzer, Gruppen und Dateiberechtigungen unter Unix-artigen +Systemen sind identisch. Das hat den Vorteil, dass es für Anwender einfacher ist +Benutzer, Gruppen und Dateiberechtigungen auf Linux Distributionen wie Debian, +Ubuntu, Linux Mint oder RHEL, CentOS, Fedora als auch BSD Distributionen wie +MacOS, FreeBSD oder OpenBSD zu übertragen. + +Optional können durch sogenannte \acrfull{acr:acl} Berechtigungen +erweitert werden, um die Rechtevergabe für Benutzer und Gruppen noch feiner +einteilen zu können. + +In der Praxis gibt es jedoch sehr selten Szenarien, bei denen dies notwendig ist. +Aus diesem Grund liefern manche Distributionen die notwendigen Programme zum +verfeinern der Rechtevergabe nicht standardmäßig aus. + +% #>------------------------------------------------------------------------<# +\subsection{Benutzer und Gruppen}% +\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen} + +Linux ist als Mehrbenutzer-Betriebssystem entwickelt worden. Dies bedeutet, dass +mehrere Benutzer gleichzeit auf dem System Prozesse ausführen können. Dabei +werden die Berechtigungen auf Dateien und Verzeichnisse klar durch den Besitzer, +als auch durch die Gruppe, welche als mehrere Benutzern bestehen kann, geregelt. + +% #>------------------------------------------------------------------------<# +\subsubsection{Benutzer}% +\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.benutzer} + +Man unterscheidet bei Benutzern zwischen funktionalen und realen Benutzern. +Funktionale Benutzer werden vorwiegend für Dienste verwendet, um zu vermeiden, +dass der Dienst ungewollt auf Dateien und Verzeichnisse Zugriff erhält. Aus +diesem Grund wird auch vermieden, dass funktionale Benutzer eine Shell öffnen +können. Dazu später mehr. + +Reale Benutzer sind natürliche Personen, die sich entweder direkt per +Desktopmanager, einer Shell oder über ein Protokoll (\acrshort{acr:rdp}, +\acrshort{acr:ssh}, \acrshort{acr:vnc}) Zugang verschaffen. + +Alle Benutzer werden in der Datei \textit{/etc/passwd} gelistet. Sie wird als +Tabellenform geführt, getrennt durch einen Doppelpunkt \textbf{:}. Zur +einfacheren Darstellung kann folgender Befehl verwendet werden. + +\begin{bashcode} +cat /etc/passwd | column --table --separator : +\end{bashcode} + +Die Spalten, exemplarisch für den Benutzer root, haben folgende Bedeutung: + +\begin{itemize}[itemsep=0pt] + \item[\textbf{1. Spalte}] Name des Benutzers + \item[\textbf{2. Spalte}] Ehemals Spalte für das Kennwort. Das \textit{x} + kennzeichnet, dass für den Benutzer in der Datei \textit{/etc/shadow} ein + Kennwort existiert. Dazu später mehr. + \item[\textbf{3. Spalte}] Die ID des Benutzers. Wird oft auch als \textit{UID} + angegeben. + \item[\textbf{4. Spalte}] Die ID der Hauptgruppe. Wird oft auch als \textit{GID} + angegeben. + \item[\textbf{5. Spalte}] Erweiterter Name des Benutzers. Damit + nachvollziehbar ist, welchem Dienst oder welcher realen Person der Benutzer + zuzuordnen ist. + \item[\textbf{6. Spalte}] Das Heimatverzeichnis des Benutzers. Im Regelfall + wird dieses Verzeichnis betreten, sofern der Benutzer sich über eine + Login-Shell anmeldet. Die Tilde verweist auf das hier definierte + Heimatverzeichnis. + \item[\textbf{7. Spalte}] Enthält den absoluten Pfad zur Login-Shell. Dies ist + im Regelfall die \acrfull{acr:bash}. Um zu vermeiden, dass sich als Benutzer + eines Dienstes angemeldet werden kann, kann hier auch auf + \textit{/usr/bin/nologin} verwiesen werden. +\end{itemize} + +Die 2. Spalte wurde ausgelagert nach \textit{/etc/shadow}, um die Sicherheit auf +dem System zu erhöhen. In der Datei \textit{/etc/shadow} werden weitere +Informationen gespeichert. Beispielsweise die Information, mit welchem +Hash-Algorithmus die Kennwörter gehasht wurden bzw. wie der Salt-Wert lautet. + +Erzeugen Sie sich erneut mit dem genannten Befehl aus Kapitel +\ref{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.benutzer} eine +Ausgabe in tabellarischer Form für die Datei \textit{/etc/shadow}. Die Spalten +haben folgende Bedeutung: + +\begin{itemize}[itemsep=0pt] + \item[\textbf{1. Spalte}] Name des Benutzers. + \item[\textbf{2. Spalte}] Das Kennwort, gespeichert als Hash mit Informationen + zum Hash.-Algorithmus. Der Wert \textit{!!} bedeutet, dass kein Kennwort + definiert wurde. + \item[\textbf{3. Spalte}] Enthält die Tage seit Beginn der Unix-Zeitrechnung, + wann das Kennwort zuletzt geändert wurde. + \item[\textbf{4. Spalte}] Tage bevor das Kennwort geändert werden muss. + \item[\textbf{5. Spalte}] Tage ab wann eine Warnung ausgegeben werden soll, + dass das Kennwort abläuft. + \item[\textbf{6. Spalte}] Tage bevor das Kennwort abläuft, nachdem keine + Anmeldung erfolgt ist. + \item[\textbf{7. Spalte}] Enthält die Tage seit Beginn der Unix-Zeitrechnung, + seit dem das Kennwort abgelaufen ist. + \item[\textbf{8. Spalte}] Reservierte Spalte. Wird aktuell nicht verwendet. +\end{itemize} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 1a:} Ermitteln Sie den Hash-Algorithmus, welcher + verwendet wurde um Ihr Kennwort zu hashen. + \item \textbf{Aufgabe 1b:} Wann beginnt die Unix-Zeitrechnung? + \item \textbf{Aufgabe 1c:} Wann wurde zuletzt das Kennwort des Benutzers root geändert? + \item \textbf{Aufgabe 1d:} Ermitteln Sie die \textbf{User-ID} ihres aktuellen + Benutzers mithilfe eines Befehls, welcher in den GNU Core Utilities enthalten + und dem Bereich \glqq{}Shell Utilities\grqq{} zugeordnet ist. + \item \textbf{Aufgabe 1e:} Nutzen Sie den Befehl \textit{wc}, um alle + eingerichteten Benutzer auf ihrem System zu zählen. Lesen Sie die Manpage für + weitere Informationen zu diesem Befehl. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsubsection{Gruppen}% +\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.gruppen} + +Ähnlich wie bei Benutzern gibt es auch Dateien in denen die Gruppen bzw. +Gruppenkennwörter festgehalten sind. Dies sind die Dateien \textit{/etc/group} +und \textit{/etc/gshadow}. Die beiden Dateien sind ähnlich wie +\textit{/etc/passwd} und \textit{/etc/shadow} aufgebaut. Sie enthalten jedoch +weniger Spalten. + +Die Datei \textit{/etc/group} enthält eine Spalte für den Namen der Gruppe, ob +ein Eintrag in \textit{/etc/gshadow} vorhanden ist, die Gruppen-ID, als auch alle +Benutzer, welche der Gruppe angehören. Die Benutzer werden durch ein Komma. + +Die Datei \textit{/etc/gshadow} enthält noch weniger Informationen. Die ersten +drei Spalten sind identisch zu den Spalten aus der Datei \textit{/etc/shadow}. +Die letzte Spalte enthält Benutzer, welcher das Kennwort ändern dürfen. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 2a:} Ermitteln Sie die \textbf{Gruppen-ID} ihres + aktuellen Benutzers mithilfe eines Befehls, welcher in den GNU Core Utilities + enthalten und dem Bereich \glqq{}Shell Utilities\grqq{} zugeordnet ist. + \item \textbf{Aufgabe 2b:} Nutzen Sie den Befehl \textit{wc}, um die Gruppen + zu zählen. Lesen Sie die Manpage für weitere Informationen zu diesem Befehl. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsubsection{Benutzer root}% +\label{sec:benutzer-gruppen-und-berechtigungen.root} + +Der Benutzer root besitzt auf allen Unix-artigen Systemen die User-ID und +Gruppen-ID 0. Er besitzt vollen Zugriff auf das gesamte System und damit auf +alle Dateien und Einstellungen aller Benutzer. Er kann beispielsweise ohne +Einschränkungen auf alle angeschlossenen Geräte unter \textit{/dev} zugreifen. + +Der Benutzer root ist ein funktionaler Benutzer, mit dem sich reale Benutzer +anmelden können, um Befehle, welche einen höheren Berechtigungsgrad benötigen, +auszuführen. Durch die Verwendung des Benutzers root ist nachträglich nicht mehr +nachvollziehbar, welcher reale Benutzer welchen Befehl ausgeführt hat. Aus +diesem Grund und anderen Gründen wurde das Programm \textit{sudo} entwickelt. + +% #>------------------------------------------------------------------------<# +\subsubsection{sudo}% +\label{sec:benutzer-gruppen-und-berechtigungen.sudo} + +Das Programm \textit{sudo} führt den nachgestellten Befehl mit root +Berechtigungen aus. Mithilfe von sudo lässt sich die Verwendung von root +Berechtigungen auf einzelne Benutzer einschränken. Für die Verwendung von +\textit{sudo} muss ein Benutzer der Gruppe \textit{wheel} unter RHEL basierenden +Distributionen angehören oder der Gruppe \textit{sudo} für Debian basierende +Distributionen. + +Mithilfe des Befehls \textit{visudo} lässt sich die Konfiguration von +\textit{sudo} bearbeiten. Dort kann unter anderem auch eingestellt werden, dass +der Aufruf eines Befehls mit \textit{sudo} keiner erneuten Kennworteingabe des +Benutzers benötigt. + +Mit dem folgenden Beispiel kann ein realer Benutzer mit \textit{sudo} den Ordner +\textit{/mnt/sda1} erstellen, für welchen root Berechtigungen notwendig sind, da +root der Eigentümer des Verzeichnisses \textit{/mnt} ist. + +\begin{bashcode} +sudo mkdir --parent /mnt/sda1 +\end{bashcode} + +Möchte man mehrere Befehle mit root Berechtigungen ausführen lohnt sich die +Anmeldung als root Benutzer von einem normalen Benutzer aus. Dies kann entweder +mit \textit{sudo -i} oder alternativ mit \textit{su} erreicht werden. + +% #>------------------------------------------------------------------------<# +\subsubsection{Passwort ändern}% +\label{sec:benutzer-gruppen-und-berechtigungen.benutzer-und-gruppen.s} + +Um das Passwort zu ändern reicht die Ausführung des Befehls \textit{passwd}. +Damit ist es möglich das Kennwort des gerade verwendeten Benutzers zu ändern. +Möchte man das Kennwort anderer Benutzer ändern, muss man root Berechtigungen +besitzen, sei es als Benutzer root oder per \textit{sudo}, und gibt hinter den +Befehl den Namen des Benutzers an, wessen Kennwort man ändern möchte. + +Das Programm \textit{passwd} ändert dem entsprechend die Zeile in +\textit{/etc/shadow} für den Benutzer, für welchen das Passwort geändert werden +soll. + +Nachteil von \textit{passwd} ist, dass es interaktiv bedient werden muss - +sprich, mit \textit{passwd} ist es nicht möglich Kennwörter von Benutzern per +Skript zu ändern. Aus diesem Grund wurde das Programm \textit{chpasswd} +entwickelt. + +Allerdings möchte man nicht nur das Kennwort eines Benutzers ändern können, +sondern auch wann das Kennwort ablaufen soll oder ab wann das System eine +Warnung ausgeben soll. Mit Hilfe des Programms \textit{chage} ist dies möglich. + +% #>------------------------------------------------------------------------<# +\subsubsection{Gruppe hinzufügen, bearbeiten und löschen}% +\label{sec:benutzer-gruppen-und-berechtigungen.gruppen.add-mod-rm} + +Das Bearbeiten der Gruppen direkt in der Datei \textit{/etc/group} sollte +vermieden werden und stattdessen auf die Programme zurück gegriffen werden, +welche die Distribution bereit stellt. + +Zum Erstellen, Bearbeiten und Löschen werden folgende Programme zur Verfügung +gestellt. + +\begin{itemize}[label={},itemsep=0pt] + \item \textit{groupadd:} Erstellt eine neue Gruppe + \item \textit{groupmod:} Modifiziert eine bestehende Gruppe + \item \textit{groupdel:} Löscht eine Gruppe +\end{itemize} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 3a:} Estellen Sie die Gruppe \textit{hr} für + \textit{human resources} mit der \textit{GID} 2000. + \item \textbf{Aufgabe 3b:} Vergewissern Sie sich, dass in der Datei + \textit{/etc/group} die neue Gruppe mit entsprechender \textit{GID} angelegt wurde. + \item \textbf{Aufgabe 3c:} Benennen Sie die Gruppe \textit{hr} nach + \textit{dev} für \textit{development} um und überprüfen Sie, ob sich der Name + der Gruppe in der Datei \textit{/etc/group} geändert hat + \item \textbf{Aufgabe 3d:} Ändern Sie die \textit{GID} auf 3000 und überprüfen + Sie, ob diese sich in der Datei \textit{/etc/group} geändert hat. + \item \textbf{Aufgabe 3e:} Löschen Sie die Gruppe \textit{dev} +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsubsection{Benutzer hinzufügen, bearbeiten und löschen}% +\label{sec:benutzer-gruppen-und-berechtigungen.benutzer.add-mod-rm} + +Ähnlich wie Gruppen können auch Benutzer hinzugefügt, modifiziert und gelöscht +werden. Auf folgende Befehle kann zurück gegriffen werden. + +\begin{itemize}[label={},itemsep=0pt] + \item \textit{useradd:} Erstellt einen neuen Benutzer + \item \textit{usermod:} Modifiziert einen bestehenden Benutzer + \item \textit{userdel:} Löscht den Benutzer +\end{itemize} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 4a:} Erstellen Sie den Benutzer \textit{manfred} mit dem + Namen \textit{Manfred Mertens}. Der Benutzer nutzt die \acrlong{acr:bash}. + Sein Heimatverzeichnis soll unter \textit{/home} erstellt werden. Das Kennwort + lautet \textit{manni}. Seine Primärgruppe lautet \textit{manfred}. Als + \textit{UID} verwenden Sie \textit{2000}. + \item \textbf{Aufgabe 4b:} Setzen Sie das Ablaufdatum des Kennworts für den + Benutzer \textit{manni} auf den \textit{31. Juni 2021} und überprüfen Sie die + passende Spalte aus der Datei \textit{/etc/shadow}. + \item \textbf{Aufgabe 4c:} Fügen Sie den Benutzer der Gruppe \textit{wheel} hinzu. + \item \textbf{Aufgabe 4d:} Entfernen Sie den Benutzer \textit{manfred} aus der + Gruppe \textit{wheel} ohne ihn dabei aus anderen Gruppen zu entfernen. + \item \textbf{Aufgabe 4e:} Setzen Sie das Kennwort des Benutzers auf + \textit{manni-der-busfahrer}. + \item \textbf{Aufgabe 4f:} Entfernen Sie den Benutzer \textit{manfred} und + löschen Sie ggfls. seine Primärgruppe, sofern niemand mehr Mitglied ist. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Dateiberechtigungen}% +\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen} + +% #>------------------------------------------------------------------------<# +\subsubsection{DOS Ideologie}% +\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.dos-ideologie} + +Unter Windows sind Grundsätzlich alle Dateien, welche auf den Suffix +\textit{.exe} enden Ausführbar. Unix-artige Systeme interpretieren Dateiendungen +anders. Sie sind ausschließlich dafür da, damit Desktopmanager wie gnome, +cinnamon, kde, xfce oder andere erkennen, um welche Datei es sich hier handel +und mit welchen Programmen aus einer Liste diese geöffnet werden können. + +Dies bedeutet, dass auch die PDF-Datei \texttt{Aufgabensammlung.pdf} ausführbar +sein kann, obwohl diese nur lesbar sein sollte, damit Programme wie evince oder +masterpdfeditor von ihr lesen können. + +% #>------------------------------------------------------------------------<# +\subsubsection{Einfache Dateiberechtigungen}% +\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.einfach} + +Unter Unix-artigen Systemen, welche die GNU Core Utilities verwenden, ist das +Programm \textit{ls} vorinstalliert. Das Programm dient zu Auflistung von +Dateien und Verzeichnissen. + +Die Ausgabe ist eine Zusammenstellung von mehreren Einträgen unterschiedlicher +Auflistungen, um Dateiberechtigungen exemplarisch zu erklären. + +\begin{verbatim} +drwxr-xr-x. 2 markus users 40 29. Sep 21:48 hello-world +-rw-r--r--. 1 christian users 0 29. Sep 21:48 hello-world2 +srw-rw----. 1 root docker 0 5. Okt 19:34 docker.sock +lrwxrwxrwx. 1 markus markus 38 14. Apr 11:32 .g -> .gnupg +brw-rw----. 1 root disk 8 5. Okt 19:34 sda +crw--w----. 1 root tty 4 5. Okt 19:34 tty0 +-rwx------. 1 demo users 0 5. Okt 20:01 mybin +\end{verbatim} + +Die Attributzeichenkette besteht auch 10 Zeichen und gibt Auskunft über den Typ +als auch die Berechtigungen auf die Ressource. + +Das erste Attribut gibt den Typ der Ressource wieder. Folgende Attribute +beschreiben die Ressource. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{-:} Ist eine normale Datei + \item \textbf{d:} \textbf{d}irectory + \item \textbf{s:} unix \textbf{s}ocket - Beispielsweise TCP socket eines Web Servers + \item \textbf{l:} symbolic \textbf{l}ink - Link auf eine andere Datei oder + anderes Verzeichnis + \item \textbf{b:} \textbf{b}lock device - Festplatten + \item \textbf{c:} \textbf{c}haracter device - Terminal +\end{itemize} + +Die verbleibenden neun Attribute werden in drei Gruppen gesplittet. Jede Gruppe +beschreibt die Berechtigungen für den Besitzer (engl. user, kurz u), die Gruppe +(engl. group, kurz g) und alle anderen Benutzer, welche weder als Besitzer noch +Mitglied in der genannten Gruppe sind. Diese Benutzer werden auch als Andere +(engl. other, kurz o) beschrieben. + +Dabei haben die Attribute folgende Bedeutung: + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{r:} \textbf{r}ead - Von Ressource lesen oder Verzeichnisinhalt + auflisten + \item \textbf{w:} \textbf{w}rite - Ressource beschreiben oder + Verzeichnisinhalt ändern (hinzufügen, umbenennen, löschen) + \item \textbf{x:} e\textbf{x}ecute - Programm ausführen oder in das + Verzeichnis hineinwechseln +\end{itemize} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 5a}: Sind block devices in der obrigen Ausgabe gelistet, + wenn ja welche? + \item \textbf{Aufgabe 5b:} Nenne alle Dateien aus der obrigen Ausgabe. + \item \textbf{Aufgabe 5c:} Kann der Benutzer \textit{root} in das Verzeichnis + \textit{hello-word} hineinwechseln, wenn ja warum? + \item \textbf{Aufgabe 5d:} Welche Gruppe und was für Berechtigungen wurden der + Aufzählung \textit{hello-world2} zugewiesen? + \item \textbf{Aufgabe 5e:} Kann der Benutzer \textit{christian} das Programm + \textit{mybin} ausführen? + \item \textbf{Aufgabe 5f:} Kann der Benutzer \textit{demo} die Datei + \textit{helloworld2} lesen? + \item \textbf{Aufgabe 5g:} Wer kann mit welchen Berechtigungen mit dem + Unix-Socket \textit{docker.sock} kommunizieren? +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsubsection{Änderung der Dateiberechtigungen}% +\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.mod} + +Die Berechtigungen auf Ressourcen als auch der Besitzer bzw. die Gruppe kann +geändert werden. Dazu sind in GNU Core Utilities folgende Programme enthalten. + +\begin{itemize}[label={},itemsep=0pt] + \item \textit{chown:} Ändert den Besitzer einer Ressource + \item \textit{chgrp:} Ändert die Gruppe einer Ressource + \item \textit{chmod:} Ändert die Berechtigung auf eine Ressource für alle + anderen Benutzer, welche weder als Besitzer noch Mitglieder der Gruppe sind +\end{itemize} + +Das Ändern des Besitzers per \textit{chown} kann durch \textit{chown user +ressource} geändert werden. Gleiches gilt für das Ändern der Gruppe: +\textit{chgrp group ressource}. Möchte man den Besitzer als auch die Gruppe in +einem ändern kann dies durch \textit{chown} umgesetzt werden. Dabei muss der +Besitzer als auch die Gruppe getrennt durch einen Doppelpunkt angegeben werden: +\textit{chown user:group ressource}. Alternativ zu den Namen kann auch die +\textit{UID} bzw. für die Gruppe die \textit{GID} verwendet werden. + +Die Dateiberechtigungen lassen sich per \textit{chmod} anpassen. Das Programm +\textit{chmod} unterstützt die Symbolische- als auch die Oktal-Notation, um +Berechtigungen für Ressourcen zu beschreiben. + +Für die Oktal-Natation müssen die Oktal-Werte für jede Gruppe (Besitzer, Gruppe, +Andere) addiert werden, um die symbolische Notation nachbilden zu können. Bei +der Symbolischen-Notation können die Gruppen über die Buchstaben u für engl. user, g +für engl. group und o für engl. other referenziert werden. + +\begin{table}[H] + \centering + \begin{tabularx}{\textwidth}{X|X|X} + \textbf{Berechtigung} & \textbf{Oktal-Wert} & \textbf{Symbolisches-Attribut} \\ + \hline\hline + read & 4 & r \\ + write & 2 & w \\ + execute & 1 & x \\ + \end{tabularx} +\end{table} + +Hier zwei Beispiele, um die Berechtigungen aus der Aufzählung aus Kapitel +\ref{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.einfach} +anzupassen. Dabei führen die ersten beiden und letzen beiden Befehle, unabhängig +von der Notation, zu dem gleichen Ergebnis. + +\begin{bashcode} +$ chmod 750 helloworld2 +$ chmod u=+rwx,g=+rx-w,o=-rwx helloworld2 + +$ chmod 775 helloworld mybin +$ chmod u=+rwx,g=+rwx,o=+rx-w mybin + +$ ls -la +drwxr-x--- 2 markus users 40 29. Sep 21:48 hello-world +-rwxrwxr-x 1 demo users 0 5. Okt 20:01 mybin +\end{bashcode} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 6a:} Wie lautet der Befehl die Berechtigung zum lesen + des Verzeichnis \textit{helloworld2} für die Gruppe zu entfernen? Bitte gebe + die Symbolische- und Oktal-Notation an. + \item \textbf{Aufgabe 6b:} Wie lautet der Befehl der Datei mybin die + Berechtigung zum Ausführen für alle Gruppen (Besitzer, Gruppe und Andere) zu + entfernen? Symbolische- und Oktal-Notation erforderlich. + \item \textbf{Aufgabe 6c:} Wie lautet der Befehl anderen Benutzern, welche + nicht Besitzer oder Mitglied der Gruppe docker sind von dem Unix-Socket + \textit{docker.sock} zu lesen. Symbolische- und Oktal-Notation erforderlich. + \item \textbf{Aufgabe 6d:} Wie lautet der Befehl den Besitzer auf + \textit{root} und die Gruppe auf \textit{markus} für die Datei + \textit{helloworld} zu setzen? Einzeiler bitte. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsubsection{Erweiterte Dateiberechtigungen}% +\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.erweitert} + +Neben den einfachen Dateiberechtigungen unterstützen alle Unix-artige Systeme +die erweiterten Dateiberechtigungen. Diese werden \textit{setuid}, +\textit{setgid} und \textit{sticky bit} genannt. + +Sie lassen sich ebenfalls über die Symbolische- als auch die Oktal-Notation +setzen. + +\begin{table}[H] + \centering + \begin{tabularx}{\textwidth}{X|X|X} + \textbf{Berechtigung} & \textbf{Oktal-Wert} & \textbf{Symbolisches-Attribut} \\ + \hline\hline + setuid & 4 & s \\ + setgid & 2 & s \\ + sticky bit & 1 & t \\ + \end{tabularx} +\end{table} + +Die \textit{setuid} auf Dateien wird ignoriert, außer sie ist ausführbar. Ist +die Datei ausführbar wird diese mit den Berechtigungen des Besitzers ausgeführt. +Ein gutes Beispiel ist das Programm \textit{/bin/passwd}. Ohne die Option +\textit{setuid} wäre ein normaler Benutzer nicht in der Lage sein Kennwort zu +ändern, da das Programm die Dateien \textit{/etc/passwd} und +\textit{/etc/shadow} bearbeitet, welche dem Besitzer \textit{root} als auch der +Gruppe \textit{root} gehören. + +Ist das \textit{setuid} auf eine Datei oder ein Verzeichnis gesetzt, wird das +Attribut \textit{x} durch ein \textit{s} unter den Berechtigungen des Besitzers +in der Attributzeichenkette ersetzt. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 7a:} Überprüfe, ob für das Programm \textit{/bin/passwd} + \textit{setuid} gesetzt ist. +\end{itemize} + +Das setzen von \textit{setuid}, \textit{setgid} und \textit{sticky bit} wird per +\textit{chmod} erreicht. Es kann die Symbolische- als auch die Oktal-Notation +verwendet werden. Exemplarisch wird nachfolgend \textit{setuid} über die +Symbolische- als auch Oktal-Notation für die Datei hello-world.py gesetzt. + +\begin{bashcode} +$ chmod 4755 hello-world-py +$ chmod u=+rws,g=+rx-w,o=+rx-w hello-world-py +\end{bashcode} + +Die erweiterte Berechtigung \textit{setgid} verhält sich analog zu +\textit{setuid}, was Dateien betrifft. Es hat jedoch noch die Besonderheit, dass +wenn \textit{setgid} auf ein Verzeichnis gesetzt ist alle erstellten Dateien und +Verzeichnisse unterhalb des Verzeichnisses die Gruppe erben. Allerdings +\textbf{nicht} die Berechtigungen. Dies kann per \acrlongpl{acr:acl} realisiert +werden. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 7b:} Erstellen Sie das Verzeichnis \textit{/tmp/setgid} + und setzen Sie die Gruppe auf \textit{users}. Überprüfen Sie, ob + \textit{setgid} erfolgreich gesetzt wurde. + \item \textbf{Aufgabe 7c:} Erstellen Sie eine neue Datei als auch ein neues + Verzeichnis in \textit{/tmp/setgid}. Überprüfen Sie, ob die Gruppe + \textit{users} für die von ihnen erstellte Datei als auch Verzeichnis gesetzt + wurde. +\end{itemize} + +Das \textit{sticky bit} wird auf Dateien ignoriert. Wird es allerdings auf ein +Verzeichnis gesetzt verhindert es, dass Benutzer Dateien und Verzeichnisse +löschen können für welche sie nicht als Besitzer hinterlegt sind. + + +% #>------------------------------------------------------------------------<# +\subsubsection{Access-Control-List}% +\label{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.acl} + +Mit \acrfull{acr:acl} können Berechtigungen granularer vergeben werden. Sie +erweitern somit die Rechteverwaltung unter Linux und werden insbesondere dafür +verwendet, Berechtigungen für neu angelegte Dateien und Verzeichnisse innerhalb +eines Verzeichnisses zu vererben. + +Unter Fedora muss das Paket \textit{acl} installiert sein, um die +Rechteverwaltung granularer einstellen zu können. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 8a:} Installieren Sie mit \textit{yum} das Paket + \textit{acl}, sofern dies nicht installiert ist. +\end{itemize} + +Das Paket \textit{acl} enthält mehrere Programme, um \acrshortpl{acr:acl} auf +dem System verwalten zu können. Dies sind die wichtigsten: + +\begin{itemize}[label={},itemsep=0pt] + \item \textit{setfacl:} Dient zum definieren von \acrshortpl{acr:acl} auf ein + Verzeichnis oder eine Datei + \item \textit{getfacl:} Liest definierte \acrshortpl{acr:acl} von einem + Verzeichnis oder einer Datei aus +\end{itemize} + +Die Programme \textit{setfacl} und \textit{getfacl} folgen einer ähnlichen +Befehlsstruktur wie \textit{chmod}, \textit{chown} und \textit{chgrp}. + +Hier ein Beispiel, um dem Benutzer \textit{christian} die Berechtigung +\textit{rwx} auf das Programm \textit{mybin} per \acrshort{acr:acl} einzuräumen. + +\begin{bashcode} +$ setfacl -m "u:christian:rwx" mybin +\end{bashcode} + +Ähnlich verhält sich das Programm, wenn man einer Gruppe oder Benutzern, welche +weder Besitzer noch Mitglieder einer Gruppe sind, Berechtigungen einräumen +möchte. + +\begin{bashcode} +$ setfacl -m "g:christian:r-x" mybin +$ setfacl -m "o:r-x" mybin +\end{bashcode} + +Führt man den Befehl \textit{ls -la} erneut aus, macht das \textit{+}-Zeichen +hinter der Attributzeichenkette auf die definierte \acrshort{acr:acl} +aufmerksam. + +\begin{verbatim} +drwxr-xr-x. 2 markus users 40 29. Sep 21:48 hello-world +-rw-r--r--. 1 christian users 0 29. Sep 21:48 hello-world2 +srw-rw----. 1 root docker 0 5. Okt 19:34 docker.sock +lrwxrwxrwx. 1 markus markus 38 14. Apr 11:32 .g -> .gnupg/ +brw-rw----. 1 root disk 8 5. Okt 19:34 sda +crw--w----. 1 root tty 4 5. Okt 19:34 tty0 +-rwx------+ 1 demo users 0 5. Okt 20:01 mybin +\end{verbatim} + +Die definierte \acrshort{acr:acl} kann per \textit{getfacl} ausgelesen werden. + +\begin{bashcode} +$ getfacl mybin +# file: mybin +# owner: demo +# group: users +user::rwx +user:christian:rwx +group::--- +group:christian:r-x +mask::rwx +other::r-x +\end{bashcode} + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 8b:} Erstellen Sie folgende Verzeichnisstruktur: + \textit{/tmp/acl-test/share} + \item \textbf{Aufgabe 8c:} Stellen Sie sicher, dass ausschließlich der + Benutzer \textit{root} und die Gruppe \textit{root} über die klassichen + Dateiberechtigungen Zugriff auf das Verzeichnis \textit{/tmp/acl-test} erhalten. + \item \textbf{Aufgabe 8d:} Erstellen Sie einen neuen Benutzer mit dem Namen + \textit{fuacl} und räumen Sie diesem per \acrshort{acr:acl} Berechtigungen + ein, Dateien und Verzeichnisse aus dem Verzeichnis \textit{/tmp/acl-test} zu + lesen, ändern und deren Inhalt aufzulisten. Überprüfen Sie die Einstellung! + \item \textbf{Aufgabe 8e:} Entziehen Sie dem Benutzer \textit{fuacl} die + Berechtigung Dateien und Verzeichnisse aus dem Verzeichnis + \textit{/tmp/acl-test/shared} zu lesen und aufzulisten. Überprüfen Sie die + Einstellung! + \item \textbf{Aufgabe 8f:} Stellen Sie sicher, dass neu erstellte Dokumente in + \textit{/tmp/acl-test} immer der Gruppe \textit{root} gehören und die + Berechtigung \textit{rwx} für Verzeichnisse und \textit{rw-} für Dateien + gesetzt werden. \textit{Tipp: setfact --default}. Überprüfen Sie die + Berechtigung durch erstellen eines neuen Dokuments. + \item \textbf{Aufgabe 8g:} Entfernen Sie ausschließlich jene + \acrshort{acr:acl}, welche vererbt wird. + \item \textbf{Aufgabe 8h:} Entfernen Sie rekursive alle \acrshortpl{acr:acl}. +\end{itemize} + +% #>------------------------------------------------------------------------<# +\subsection{Praxisaufgabe: Verzeichnisstruktur mit Dateiberechtigungen erstellen}% +\label{sec:benutzer-gruppen-und-berechtigungen.praxis-task} + +Sie befinden sich in folgender Situation: + +Das Unternehmen indem Sie arbeiten wechselt aus Kostengründen von Windows +Sharepoint zu Samba. Ihr Vorgesetzter hat Sie daher gebeten Vorbereitungen für +den Umstieg zu treffen. Darunter auch die notwendige Verzeichnisstruktur für die +Abteilungen als auch die Benutzer und Gruppen zu erstellen, sowie Berechtigungen +den Vorgaben entsprechend anzupassen. + +Folgende Beziehungen führt das Unternehmen zwischen Mitarbeiter und Abteilungen. + +\begin{table}[H] + \centering + \begin{tabularx}{\textwidth}{X|X} + \textbf{Mitarbeiter} & \textbf{Abteilungen} \\ + \hline\hline + Hugo McKinnock & Entwicklung \\ + Hans Rakinzky & Entwicklung, System Administration \\ + Marie Haseloff & Personalabteilung, Buchhaltung \\ + Sophie Becker & Personalabteilung \\ + Axel Tuller & System Administration \\ + Tobias Moretti & Entwicklung, Qualitätssicherung \\ + Lisa Meerkamp & Sekretärin \\ + Manfred Krupp & Vorstand \\ + \end{tabularx} +\end{table} + +Die Verzeichnisstruktur ist unter \textit{/srv/documents} zu erstellen. Dabei +besitzt jede Abteilung ihr eigenes Verzeichnis. Innerhalb ihres Verzeichnisses +erhalten fast alle Abteilungen das Verzeichnis \textit{public} und +\textit{private}. Die Abteilung Entwicklung und Qualitätssicherung haben kein +Verzeichnis \textit{private}, da ihre Dokumente allen Benutzern im Unternehmen +zugänglich sein sollen. Dagegen besitzen die Abteilungen Sekreteriat als auch +Vorstand kein Verzeichnis \textit{public}, sondern ausschließlich +\textit{private}. + +In den Verzeichnissen \textit{private} können ausschließlich Mitglieder der +Abteilung lesen und schreiben. Neu erstellte Dokumente gehören der Abteilung und +dem Benutzer \textit{root}. Ähnlich ist dies für das Verzeichnis +\textit{public}. Alle Benutzer können die Dateien oder Verzeichnisse öffnen. +Allerdings können nur Mitglieder der Abteilung neue Dokumente erstellen und +bearbeiten. + +Bitte geben Sie die nötigen Befehle an, mit denen Sie die nachfolgenden Aufgaben +lösen. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 9a:} Erstellen Sie die Gruppen, beginnend mit der + \textit{GID} 2000. + \item \textbf{Aufgabe 9b:} Erstellen Sie die Benutzer, beginnend mit der + \textit{UID} 2000. Die Primärgruppe ist \textit{users}. + \item \textbf{Aufgabe 9c:} Verknüpfen Sie die Benutzer mit den Gruppen. + \item \textbf{Aufgabe 9d:} Erstellen Sie die beschriebene Verzeichnisstruktur. + \item \textbf{Aufgabe 9e:} Setzen Sie die beschriebenen Berechtigungen um. + \item \textbf{Aufgabe 9f:} Melden Sie sich unter dem Benutzer von Marie + Haseloff per \textit{sudo} an und überprüfen Sie folgende Berechtigungen: + \begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 9f$_1$:} Erstellen, bearbeiten und löschen von Dateien + und Verzeichnissen in der für Ihr, über die Abteilung, zugewiesenen + Verzeichnisse. + \item \textbf{Aufgabe 9f$_2$:} Neu erstellte Dokumente und Verzeichnisse + gehören der jeweiligen Abteilung. Verzeichnisse haben die + Gruppenberechtigung \textit{rwx}. Dateien haben die Gruppenberechtigung + \textit{rw-}. + \item \textbf{Aufgabe 9f$_3$:} Von Dateien und Verzeichnissen der Abteilung + Vorstand darf weder gelesen noch geschrieben als auch deren Inhalt gelistet + werden. + \item \textbf{Aufgabe 9f$_4$:} Dateien aus dem Verzeichnis \textit{public} + der Abteilung System Administration sind lesbar, aus dem Verzeichnis + \textit{private} nicht. + \end{itemize} +\end{itemize} diff --git a/chapters/05-directory-structure.tex b/chapters/05-directory-structure.tex new file mode 100644 index 0000000..dc2a943 --- /dev/null +++ b/chapters/05-directory-structure.tex @@ -0,0 +1,221 @@ +% <#>-----------------------------------------------------------------------<#> +\section{Verzeichnisstrukturen}% +\label{sec:verzeichnisstrukturen} + +Das Konzept der Verzeichnisstruktur von Unix-artigen Betriebssystemen ist +annähernd identisch. Es gibt jedoch Besonderheiten zwischen den einzelnen +Abspaltungen von Unix hinsichtlich Linux und BSD, als auch der jeweiligen +Distributionen und Abspaltungen: Debian, RHEL, OpenBSD etc. Da jedoch die +Vielfalt zu groß für dieses Kapitel wäre, werden diese hier nicht näher +behandelt. + +% >---------------------------------------------------------------------------< +\subsection{/ (root directory, Wurzelverzeichnis)}% +\label{sec:verzeichnisstrukturen.root} + +% NOTE: Missing reference to chapter where devices will be mounted +Das Wurzelverzeichnis \textit{/} ist die oberste Verzeichnisebene. Es enthält +alle weiteren Unterverzeichnisse und Dateien unabhängig, ob diese sich auf einem +physikalisch anderen Gerät befinden. Dazu später mehr. + +% >---------------------------------------------------------------------------< +\subsection{/bin/}% +\label{sec:verzeichnisstrukturen.bin} + +Systemrelevante Programme, beispielsweise jene, welche Bestandteil der GNU Core +Utility Collection sind werden in dem Verzeichnis \textit{/bin/} gespeichert. +Dies sind zum Beispiel \textit{chmod}, \textit{chown}, \textit{chgrp}, +\textit{id}, \textit{cp}, \textit{mv} oder \textit{rm}. Im Regelfall sind alle +Programme, welche notwendig sind das System erfolgreich zu booten im Verzeichnis +\textit{/bin/} hinterlegt. + +% >---------------------------------------------------------------------------< +\subsection{/boot/}% +\label{sec:verzeichnisstrukturen.boot} + +In dem Verzeichnis \textit{/boot/} befindet sich der Linux Kernel. Der Linux +Kernel wird als Datei gespeichert. Im Dateinamen aller unterschiedlichen +Kernelversionen befindet sich in der Regel die folgende Zeichenkette, wenn je +nach Distribution diese nicht überschrieben wurde: \textit{vmlinux}. + +% NOTE: Missing reference to chapter where linux system will be booted +Neben dem Kernel befindet sich in dem Verzeichnis passend zu den installierten +Kernelversionen noch die Datei \textit{initramdisk}. Sie wird in den +\acrshort{acr:ram} während des Bootvorgangs geladen und startet den Kernel. Mehr +zum Bootvorgang unter Linux in einem späteren Kapitel. + +% >---------------------------------------------------------------------------< +\subsection{/boot/EFI/}% +\label{sec:verzeichnisstrukturen.efi} + +Das Verzeichnis \textit{/boot/EFI} ist ausschließlich bei Systemen vorhanden, +welches statt der \acrshort{acr:bios} Bootmethode \acrshort{acr:uefi} verwendet. +Das Verzeichnis beinhalter die unterschiedlichen Bootloader. Beispielweise den +von Windows, GRUB oder systemd-boot. + +Ratsam ist es daher das Verzeichnis \textit{/boot/EFI} als seperate Partition zu +behandeln, sodass wenn mehrere Systeme installiert sind ein und die selbe EFI +Partition verwendet werden kann. Dies hat den Vorteil, dass ausschließlich eine +Partition in der Firmware des Motherboards angeben werden muss, damit die +Firmware die entsprechenden Bootloader von den jeweiligen Systemen findet. + +% >---------------------------------------------------------------------------< +\subsection{/dev/}% +\label{sec:verzeichnisstrukturen.dev} + +Physische als auch virtuelle Peripheriegeräte, beispielsweise die physisch +verbaute oder dem Gastsystem zugewiesene virtuelle Festplattte, werden neben +anderen Geräten im Verzeichnis \textit{/dev/} als Datei abgebildet. Siehe +Kapitel +\ref{sec:benutzer-gruppen-und-berechtigungen.dateiberechtigungen.einfach}, um +aus der Attributszeichenkette erkennen zu können, bei welcher Datei es sich um +ein Blockdevice handelt. + +Auf diese speziellen Dateien kann anschließend mit anderen Programmen +zugegriffen werden. Beispielsweise das Einbinden eines Blockgerätes (Festplatte) +an einen beliebigen Einbindungspunkt - siehe \textit{mount} Befehl. + +% >---------------------------------------------------------------------------< +\subsection{/etc/}% +\label{sec:verzeichnisstrukturen.etc} + +In dem Verzeichnis \textit{/etc/} sind Konfigurationsdateien von Programmen +enthalten. Im Regelfall werden diese durch die Entwickler bereitgestellt. +Beispielsweise durch Installation des entsprechenden \acrshortpl{acr:rpm}. + +Sind keine Konfigurationsdateien für ein Programm im Verzeichnis \textit{/etc/} +vorhanden. Können diese auch unter \textit{/usr/} gespeichert sein. Ein +manuelles platzieren der Konfigurationsdateien unter \textit{/etc/} würde das +Standardverhalten des Programms übersteuern. + +% >---------------------------------------------------------------------------< +\subsection{/home/}% +\label{sec:verzeichnisstrukturen.home} + +Es ist das Standardverzeichnis für normale bzw. reale Benutzer. Dieses +Verzeichnis wird manchmal auch mit anderen Linux-Distributionen geteilt, sofern +das gleiche Heimatverzeichnis von mehreren Benutzern unterschiedliche +Distributionen verwendet werden soll. + +% >---------------------------------------------------------------------------< +\subsection{/lib/}% +\label{sec:verzeichnisstrukturen.lib} + +Bibliotheken, welche gemeinsam durch mehrere Programme, welche sich in den +Verzeichnissen \textit{/bin/} und \textit{/sbin} befinden, geteilt werden, +werden im Verzeichnis \textit{/lib} gespeichert. + +% >---------------------------------------------------------------------------< +\subsection{/media/}% +\label{sec:verzeichnisstrukturen.media} + +In dem Verzeichnis \textit{/media/} werden entfernbare Dateisysteme eingebunden. +Beispielsweise der USB-Stick, eine USB-Festplatte oder eine CD bzw. DVD, welche +sich im Laufwerk befindet. + +Desktopmanager wie Gnome, Cinnamon, Xfce oder KDE übernehmen hier die Funktion, +das Gerät automatisch unter \textit{/media/} einzubinden. + +% >---------------------------------------------------------------------------< +\subsection{/mnt/}% +\label{sec:verzeichnisstrukturen.mnt} + +Andere Systempartitionen, beispielsweise die C: oder D: Partition von +Windowssystemen auf einem Dualboot System, werden unter \textit{/mnt/} +eingebunden. Im Regelfall auch nur temporär, beispielsweise wenn der +Systemadministrator versucht unter Linux auf die Windowspartitionen zu +zugreifen. + +% >---------------------------------------------------------------------------< +\subsection{/opt/}% +\label{sec:verzeichnisstrukturen.opt} + +Das Verzeichnis \textit{/opt} ist das Standardverzeichnis für proprietäre +Programme und steht für \textit{optional package tree}. In diesem Verzeichnis +legen daher im Regelfall proprietäre Programme Binär-, Konfigurations-, und +Bibliotheksdateien ab. + +Beispielsweise, wenn man einen TeamSpeak 3 Server oder Druckertreiber von +Brother installieren möchte, werden diese unter \textit{/opt} installiert. + +% >---------------------------------------------------------------------------< +\subsection{/root/}% +\label{sec:verzeichnisstrukturen.root} + +Der Benutzer \textit{root} besitzt sein eigenes Heimatverzeichnis direkt +unterhalb des Wurzelverzeichnisses. Es ist das Verzeichnis \textit{/root/}. Es +wird gesondert geführt und ausschließlich der Benutzer \textit{root} besitzt +Berechtigungen von dem Verzeichnis zu lesen und zu schreiben als auch es +betreten zu können. + +% >---------------------------------------------------------------------------< +\subsection{/run/}% +\label{sec:verzeichnisstrukturen.run} + +Programme, welche ausgeführt werden und Informationen auslagern speichern diese +im Verzeichnis \textit{/run/}. Dies können beispielsweise Unix-Sockets oder auch +temporäre Einstellungsparameter sein, welche nur zur Laufzeit des Programms +vorhanden sind. + +Die Dateien werden nicht im Verzeichnis \textit{/tmp/} gespeichert, da Dateien +und Verzeichnisse unter \textit{/tmp/} automatisch entfernt werden können. +Beispielsweise, wenn das System bemerkt der Speicherplatz geht zur Neige. + +Der Dienst \textit{systemd-resolved} speichert als gutes Beispiel unter +\textit{/run/systemd/resolve/resolv.conf} die \textit{resolv.conf} Datei ab, +welche von \textit{/etc/resolv.conf} per symbolischen link referenziert wird. + +% >---------------------------------------------------------------------------< +\subsection{/sbin/}% +\label{sec:verzeichnisstrukturen.sbin} + +Das Verzeichnis \textit{/sbin} ist identisch zu dem Verzeichnis \textit{/bin}. +Es enthält jedoch ausschließlich Programme welche für den Benutzer \textit{root} +vorgesehen sind. + +% >---------------------------------------------------------------------------< +\subsection{/srv/}% +\label{sec:verzeichnisstrukturen.srv} + +Stellt das System beispielsweise Mail-, Web- oder andere Dienste bereit, werden +die persistenten Daten unter \textit{/srv/} gespeichert. Dieses Verzeichnis ist +nicht automatisch Bestandteil jeder Distribution. Es kann daher sein, das gerade +bei Distributionen, welche einen minimalistischen Ansatz fahren nicht vorhanden +ist. + +% >---------------------------------------------------------------------------< +\subsection{/tmp/}% +\label{sec:verzeichnisstrukturen.tmp} + +Das \textit{/tmp/} Verzeichnis ist der generelle Speicherort für temporäre +Dateien. Ältere Systeme verwenden eine eigene Partition für das Verzeichnis +\textit{/tmp/}, um die Größe zu limitieren. Neuere Systeme, welche systemd +verwenden, richten das Verzeichnis \textit{/tmp/} als +\nameref{sec:dateisysteme.tmpfs} +Dateisystem ein und limitieren dieses auf eine prozentuale Größe. + +% >---------------------------------------------------------------------------< +\subsection{/usr/}% +\label{sec:verzeichnisstrukturen.usr} + +Anwendungen und Dateien die von realen Benutzern verwendet werden, werden im +Gegensatz zu Anwendungen und Dateien welche vom System verwendet werden, unter +\textit{/usr/} gespeichert. Aus diesem Grund sind unterhalb von \textit{/usr/} +auch Verzeichnisse wie \textit{/usr/bin}, \textit{/usr/sbin} oder +\textit{/usr/lib} enthalten. Alle Unterverzeichnisse von \textit{/usr/} sind für +Benutzer nur lesbar und betretbar. Dateien sind in der Regel ebenfalls nur +lesbar eventuell noch ausführbar. + +% >---------------------------------------------------------------------------< +\subsection{/var/}% +\label{sec:verzeichnisstrukturen.var} + +Der Grundgedanke des Verzeichnisses \textit{/var/} ist, dass es das Gegenstück +zu \textit{/usr/} abbilden soll. Hier können Benutzer beliebig Dateien oder +Verzeichnisse erstellen. Allerdings sind können diese Eingeschränkt sein. + +Ein gutes Beispiel sind Logdateien. Würden Logdateien eines Programms, welche +aus dem Verzeichnis \textit{/usr/bin} oder \textit{/usr/sbin} ausgeführt werden, +in das Verzeichnis \textit{/usr/} speichern, würde dies gegen das Konzept des +Verzeichnisses \textit{/usr/} sprechen. Aus diesem Grund werden Logdateien in +das Verzeichnis \textit{/var/log} gespeichert. diff --git a/chapters/06-filesystems.tex b/chapters/06-filesystems.tex new file mode 100644 index 0000000..1f18518 --- /dev/null +++ b/chapters/06-filesystems.tex @@ -0,0 +1,404 @@ +% <#>---------------------------------------------------------------------------<#> +\section{Dateisysteme}% +\label{sec:dateisysteme} + +Je nach Kernel werden unterschiedliche Dateisysteme unterstützt. Bekannt von +Windows ist Ihnen bestimmt das \acrfull{acr:ntfs}. Linux unterstützt im +Gegensatz zum Windows NT Kernel nicht nur ein oder zwei Dateisysteme sondern +eine große Vielzahl, beispielsweise \acrshort{acr:ext3}, \acrshort{acr:ext4}, +\acrshort{acr:btrfs}, \acrshort{acr:eCryptfs}, \acrshort{acr:reiser} oder XFS. + +Jedes Dateisystem hat Stärken und Schwächen. Aus diesem Grund werden nicht alle +Dateisysteme detailiert betrachtet, sondern ausschließlich \acrshort{acr:btrfs}, +welches für Fedora 33 als Standard Dateisystem angekündigt +ist\footcite{fedora33-btrfs-default} als auch kleinere Dateisysteme, welche +nicht direkt eine physische oder virtuelle Festplatte vorraussetzen. + +% #>-------------------------------------------------------------------------<# +\subsection{BtrFS}% +\label{sec:dateisysteme.btrfs} + +Das \acrshort{acr:btrfs} Dateisystem ist ein \acrlong{acr:cow} Dateisystem. +\acrshort{acr:cow} bedeutet, dass für Dateien, welche kopiert werden, nicht der +selbe Speicherplatz anfällt. Sie werden stattdessen nur referenziert. Dies hat +den Vorteil, das Speicherplatz eingespart werden kann. Im Umfeld von +systemorierntierten Programmiersprachen wie C, Rust oder Go, kann dies mit dem +Konzept von Pointern verglichen werden. Wobei statt Speicheradressen die +Dateisystemblöcke referenziert werden, welche die Datei im Dateisystem abbilden. + +\acrshort{acr:btrfs} bietet mehrere Funktionen an, welche in dem Umfang kein +anderes Dateisystem anbietet. Hier einige Informationen über \acrshort{acr:btrfs}: + +\begin{itemize}[itemsep=0pt] + \item Dynamisch wachsende Inodes + \item Verwaltung von Subvolumes + \item Erstellung von Snapshots pro Subvolume + \item Datenkompression auf Dateisystemebene + \item Dateisystemcheck und Defragmentierung während des Betriebs + \item Prüfsummenbasiert + \item Integrierte \acrshort{acr:raid} option, wobei nur \acrshort{acr:raid} 0 + und 1 als stabil zu betrachten sind +\end{itemize} + +% >---------------------------------------------------------------------------< +\subsubsection{Was ist genau BtrFS}% +\label{sec:dateisysteme.btrfs.erklaerung} + +Eine \acrshort{acr:btrfs}-Partition stellt eine Volume dar, welches in mehrere +Subvolume unterteilt werden kann. Subvolumes stehen in ihrer Eigenschaft +zwischen Partitionen und Verzeichnissen. Partitionen haben eine feste Größe, +Subvolumes nicht, außer sie werden durch Quotas limitiert. Daher verhalten sich +Subvolumes ähnlich wie Verzeichnisse. + +Im Verzeichnisbaum des Systems werden Subvolumes automatisch als Ordner +eingehängt. In Ubuntu-Derivaten und OpenSUSE hat es sich eingebürgert +Top-Level-Subvolumen mit einem vorangestellten \textit{@} zu benennen. Dies ist +eine reine Konvention unter den Nutzern dieser Linux-Derivate und formell nicht +nötig. Subvolumen bedürfen keiner speziellen Nomenklatur. Es ist sogar +hinderlich, da jedes Subvolumen welches anders heißt als wie vom System erwartet +explizit eingehängt werden muss.\footcite{was-ist-btrfs} + +\acrshort{acr:btrfs} erlaubt zudem das Erstellen von Snapshots. Snapshots +representieren eine Momentaufnahme eines Subvolumes. Snapshots müssen auf der +selben \acrshort{acr:btrfs} Partition gespeichert werden wie das Subvolume. +Enthält ein Subvolume einen Snapshot, enthält der Snapshot nicht rekursiv alle +Snapshots, welche zum Zeitpunkt der Erstellung vorhanden waren. Da Snapshots +Momentaufnahmen sind, können diese sehr leicht zurück gespielt werden. Hier ist +allerdings zu beachten, dass ein Snapshot kein Backup im eigentlichen Sinne ist. +Backups werden auf physisch getrennte Geräte gespeichert, was bei Snapshots +nicht der Fall ist. + +Dateien und Verzeichnisse, welche durch einen Snapshot kopiert werden, belegen +nicht zusätzlichen Speicherplatz. Sie werden nur von ein oder mehreren Quellen +referenziert. Folgende Abbildung beschreibt den Prozess und die Referenzierung: + +\begin{figure}[H] + \centering + \includegraphics[width=1\textwidth]{img/btrfs-cow.png} + \caption{Referenzierung von Speicherblöcken}% + \label{fig:dateisysteme.btrfs.referenzierung-von-speicherbloecken} +\end{figure} + +Erst wenn alle Referenzen gelöscht sind können die Dateisystemblöcke +überschrieben werden. + +% >---------------------------------------------------------------------------< +\subsubsection{Step-By-Step}% +\label{sec:dateisysteme.btrfs.step-by-step} + +Mit dem Befehl \textit{mkfs.btrfs} kann eine \acrshort{acr:btrfs} Dateisystem +auf einer leeren Partition erstellt werden. Mit dem Befehl \textit{parted} oder +\textit{fdisk} lassen sich Partitionen einer Festplatte bearbeiten, +beispielsweise um neue zu erstellen, zu löschen oder deren Größe anzupassen. + +Bei der Erstellung eines \acrshort{acr:btrfs} Dateisystems wird zwischen Daten +und Metadaten unterschieden. Bei Daten handelt es um die Daten welche auf der +Festplatte gespeichert werden. Metadaten enthalten dagegen Informationen, welche +Datei durch welches Subvolume oder Snapshot referenziert wird. Für beide +Informationsträgertypen kann zwischen mehreren Profilen unterschieden werden. Es +können Beispielsweise die Daten auf einem \acrshort{acr:raid}-0 und die +Metadaten auf einem \acrshort{acr:raid}-1 gespeichert werden. Je nach +Einsatzszenario kann ein vordefiniertes Profil bei der Erstellung verwendet +werden. Das verwendete Profil lässt sich nachträglich nicht mehr ändern. + +Neben den Profilen lassen sich auch weitere Informationen für die +\acrshort{acr:btrfs} Partition definieren. Beispielsweise das Label oder die +UUID. + +\begin{itemize}[label={},itemsep=0pt] + \item \textbf{Aufgabe 1a:} Binden Sie über ihren HyperVisor (HyperV, + \acrshort{acr:kvm} oder Virtual Box) zwei neue virtuelle Festplatten an ihre + VM. Beide virtuelle Festplatten sollen eine Größe von 5GB besitzen. Starten + Sie, nachdem Sie die virtuellen Festplatten der VM zugewiesen haben, die + Virtuelle Maschine und überprüfen Sie mit \textit{lsblk} (list block devices), + ob beide virtuelle Festplatten durch ihre VM erkannt wurden. + \item \textbf{Aufgabe 1b:} Welche unterschiedlichen Profile werden von dem + \acrshort{acr:btrfs} Dateisystem unterstützt? + \item \textbf{Aufgabe 1c:} Erstellen Sie eine neue Partition mit dem + Partitionsschema \textit{msdos}. Nutzen Sie zur Partitionierung entweder + \textit{parted} oder \textit{fdisk}. + \item \textbf{Aufgabe 1d:} Richten Sie ein neues \acrshort{acr:btrfs} + Dateisystem ein. Verwenden Sie dazu die beiden virtuellen Festplatten. Die + Daten als auch Metadaten sollen als \acrshort{acr:raid}-1 vor einem + Festplattenausfall geschützt werden. Verwenden Sie als Label + \textit{btrfs-raid-1}. +\end{itemize} + +Physische als auch virtuelle Geräte können an unterschiedlichen Stellen im +Verzeichnisbaum eingebunden werden. Zum Einbinden eines Gerätes in den +Verzeichnisbaum wird der Befehl \textit{mount} verwendet. Die allgemeine Syntax +lautet: + +\begin{bashcode} +$ mount [-t , -o