Да, 3.14здострадальные посты заходят намного эффективнее, видимо больную тему затронул

Ладно, тут пост еще интересный от Tagd Tagd завалялся, внимание на 1С не обращаем, важен сам концепт. Поехали!

БЕЗДУМНАЯ НАСТРОЙКА SSH по SSH МОЖЕТ ПРИВЕСТИ К ПОТЕРЕ КОНТРОЛЯ НАД СЕРВЕРОМ

Сегодня мы рассмотрим как переложить свою работу на чужие плечи, но чтобы ничего не сломалось. Я админю сервера с 1с. И очень часто разработчики просят перезагрузить какой-нибудь сервис или сервер.

Вместо web-админок предлагаю использовать ssh-админки. Я им больше доверяю.

sudo vim /usr/local/bin/servcontrol

#!/bin/bash
trap '' SIGINT SIGTERM SIGHUP DEBUG
declare -i MULTICOLUMN=0
declare -ir CMD_COL=3 #command column
declare -ir DLY_COL=4 #delay column
declare -ir NOCONFIRM_COL=5
declare -i COLS=$(echo "cols"|tput -S)
declare -i NUM=0
declare -u ANS
function ini(){ echo '
# (autonum_1) : name_2 : command_3 : delay_sec_4 : [NO_confirm_5]
Exit menu       :exit:0:y
restart_postgres:systemctl postgresql restart:60
restart_1c_1541 :systemctl srv1cv83 restart:60
restart_1c_2541 :systemctl srv1cv83_2 restart:60
REBOOT__SERVER  :reboot:10
'|awk '!/^#/ && NF {print ++i ":" $0}'
}
function get_ini_col(){ ini|awk -F: -vn=$1 -vc=$2 '$1==n{print $c;exit}';}
function prn_sleep(){
  declare -i I=$1
  while [[ $I -gt 0 ]];do
    echo -ne "$I\033[0K\r"
    sleep .99
    I=$I-1
  done
}
[[ $MULTICOLUMN -eq 0 ]] && CMDE='cat' || CMDE='column -x -c$COLS'
declare -i MAX=$(ini |awk -F: '{m=$1}END{print m}')
while :;do
  clear
  ini|awk -F: '{print $1,$2,"delay",$4 }'|eval $CMDE
  read -p "select item number = "
  #protection
  NUM=$(echo $REPLY|sed 's/[^0-9]//g')
  if [[ $NUM -le 0 ]] || [[ $NUM -gt $MAX ]];then
    continue
  fi
  CMD=$(get_ini_col $NUM $CMD_COL)
  DLY=$(get_ini_col $NUM $DLY_COL)
  clear
  echo delay "$DLY"
  echo "$CMD"
  #confirmation
  if [[ -n $(get_ini_col $NUM $NOCONFIRM_COL) ]];then
    ANS="YES"
  else
    read -p "Type YES to confirm operation " ANS
  fi
  if [[ "$ANS" == "YES" ]];then
    clear
    echo "$CMD"
    prn_sleep $DLY
    $CMD
    exit
  else
    echo "Operation caneled"
    sleep 1
  fi
done
#--

Данный скрипт позволяет перезапустить postgres, сервисы 1с на первом или втором комплекте портов или ребутнуть весь сервак. Разбор скрипта делать не буду, если кому-нибудь будет интересно - напишу разбор отдельной статьей.

sudo chmod 755 /usr/local/bin/servcontrol

в файле /etc/ssh/sshd_config
Match User bashdays_tagd
    MaxAuthTries 3
    MaxSessions 1
    PasswordAuthentication no
    PermitEmptyPasswords no
    PubkeyAuthentication yes
    allowtcpforwarding no
    ForceCommand sudo /usr/local/bin/servcontrol
#--

sudo service sshd restart

Ну, и самое главное. Чтобы эта вся фигня заработала, нужно либо запускать скрипт от root, либо разрешить выполнение скрипта под sudo без пароля для этого пользователя/группы.

Добавляем запись в конец файла /etc/sudoers.

Она позволит запускать указанный скрипт пользователю bashdays_tagd с привилегиями root. Следовательно, все команды в скрипте будут работать.

sudo vim /etc/sudoers

bashdays_tagd ALL=(ALL) NOPASSWD: /usr/local/bin/servcontrol

После подключения ssh bashdays_tagd@host.name

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Пользователь видит интерактивное меню со списком команд, которые может выбрать. И все! Команда reboot в скрипте выполняется с задержкой в 5 минут.

Это сделано для того, чтобы нельзя было ребутить сервак в быстром цикле. По идее 5 минут должно хватить, чтобы отключить учетку хакнутого/сумасшедшего пользователя или отредактировать sshd_config или sudoers.

man sshd_config man sudoers