#!/bin/bash
# Скрипт работает в двух режимах:
#
# - Мониторинг событий поступающих в файл  /etc/kubernete/audit/audit.log
#   Если на запрос API-сервер ответл кодом > 400, то данное событие пишется в системный лог
#   и добавляется к файлу событий монтиринга /var/lib/podsec/log/kubeapi/forbidden.log
#
# - Передача накопленных в файле событий монтиринга /var/lib/podsec/log/kubeapi/forbidden.log системному админстратору
export TEXTDOMAINDIR='/usr/share/locale'
export TEXTDOMAIN='podsec-inotify'

. podsec-policy-functions
. podsec-inotify-functions
EVENTFILE=/var/lib/podsec/u7s/log/kubeapi/forbidden.log
LASTEVENTTIMEFILE=/var/lib/podsec/u7s/log/kubeapi/lastTime.log
AUDITFILE='/etc/kubernetes/audit/audit.log'
export PROGNAME=$(basename $0)

if [ $# -ne 1 ]
then
  echo $(gettext 'Invalid number of parameters')
  echo -ne "$(gettext 'Format'):\n$PROGNAME [-d | -m]\n'" >&2
  exit 1
fi

if [ "$1" = '-d' ]
then
  # Мониторинг
  if [ -s $LASTEVENTTIMEFILE ]
  then
    lastTime=$(cat $LASTEVENTTIMEFILE)
    filtr="select(.[0]>$lastTime)"
  else
    filtr="."
  fi

  key='c'
  prefix=${LEVELSNAMES[$key]}
  priority=${JOURNALPRIORITY[$key]}
  tail -n 1000000 -f $AUDITFILE |
  jq --unbuffered -c '. |
    select(.responseStatus.code >= 400) |
    [.requestReceivedTimestamp,.sourceIPs[0],.responseStatus.message] |
    '$filtr''  |
  tee -a $EVENTFILE |
  sed -u 's/^/'$prefix': /' |
  logger -p "$priority" -t "$PROGNAME"
elif [ "$1" = '-m' ]
then
  # Передача почты
  if [ -s $EVENTFILE ]
  then
    if [ -n "$MAILTO" ]
    then
      mail -s "$(gettext 'Detected requests to the kubernetes cluster with excess authority')" root < $EVENTFILE
    fi
    tail -1 $EVENTFILE | jq '.[0]' > $LASTEVENTTIMEFILE
    true > $EVENTFILE
  fi
else
  echo $(gettext 'Invalid value for 1st parameter') >&2
  echo -ne "$(gettext 'Format:')\n$PROGNAME [-d | -m]\n'" >&2
  exit 1
fi

exit 0


