Категории

четверг, 14 марта 2013 г.

FreeBSD chroot sftp и chroot ssh.

Для предоставления доступа через ssh и sftp например к файлам сайта, можно использовать штатный для FreeBSD демон sshd.
Для начала добавим в конфиг демона /etc/ssh/sshd_config строки:
############## : BEGIN
#pw usermod sftponly -d /usr/local/www/
#chown root:wheel /usr/local/www/
#AllowGroups wheel sftp
#AllowUsers user1 user2 user3@192.168.1.1 user3@192.168.2.*

Match User web
   ChrootDirectory /home/%u
   X11Forwarding no
   AllowTcpForwarding no

Match Group sftp
   ChrootDirectory %h
   X11Forwarding no
   AllowTcpForwarding no
   ForceCommand internal-sftp
############## : END
Добавляем в систему пользователя sftp и web:
FreeBSD# adduser
Username: sftp
Full name:     
Uid (Leave empty for default): 
Login group [sftp]: 
Login group is sftp. Invite sftp into other groups? []: 
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]: nologin
Home directory [/home/sftp]: /usr/local/www
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: 
Use an empty password? (yes/no) [no]: 
Use a random password? (yes/no) [no]: 
Enter password: 
Enter password again: 
Lock out the account after creation? [no]: 
Username   : sftp
Password   : *****
Full Name  : 
Uid        : 1002
Class      : 
Groups     : sftp 
Home       : /usr/local/www
Home Mode  : 
Shell      : /usr/sbin/nologin
Locked     : no
OK? (yes/no): y
adduser: INFO: Successfully added (sftp) to the user database.
Add another user? (yes/no): y
Username: web
Full name: 
Uid [1003]: 
Login group [web]: 
Login group is web. Invite webb into other groups? []: 
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]: csh
Home directory [/usr/local/web]: /home/web
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: 
Use an empty password? (yes/no) [no]: 
Use a random password? (yes/no) [no]: 
Enter password: 
Enter password again: 
Lock out the account after creation? [no]: 
Username   : web
Password   : *****
Full Name  : 
Uid        : 1003
Class      : 
Groups     : web 
Home       : /home/web
Home Mode  : 
Shell      : /bin/csh
Locked     : no
OK? (yes/no): y
adduser: INFO: Successfully added (web) to the user database.
Add another user? (yes/no): n
Goodbye!
Теперь нужно создать chroot окружение для пользователя web, для этого я написал скрипт add_ssh_chrootuser.sh:
#!/bin/sh

# Проверка задано ли имя пользователя
if [ "$1" = "" ] ; then
 echo "  Usage: $0 [ username ]"
 exit 1
fi

USER=$1
GID=$(id -g $USER)
HOMEDIR=/home/$USER

# Задаем список каталогов в chroot окружении.
SKEL="/bin
    /sbin
    /etc
    /home
    /home/$USER
    /lib
    /libexec
    /tmp
    /usr
    /usr/bin
    /usr/local
    /usr/share
    /usr/local/bin
    /usr/local/etc
    /usr/local/share
    /usr/local/libexec"

# Создаем структуру каталогов внутри chroot окружения
for i in $SKEL; do
 [ ! -d $HOMEDIR$i ] && mkdir $HOMEDIR$i
done

# Определяем какие библиотеки необходимо скопировать
for item in sh csh zcat cat tbl groff chmod cp echo \
    ln ls date expr mkdir mv pwd locale \
    rm rmdir awk bzip2 diff du \
    ee fetch find grep gunzip gzip \
    more less sed sort tail head \
    tar touch vi ee mc mcedit \
    mysql mysqldump clear tput reset man zcat troff grotty; do
 p=$(whereis -q $item | cut -d' ' -f1)
 if [ -n "$p" ]; then
  # Копируем бинарники внутрь chroot окружения
  cp $p $HOMEDIR$p
  ldd $p | awk '{print $3}' | grep '.' >>/tmp/chroot_liblist
  #ldd $CMD_LIST|grep -v ':$'|grep -v "not a dynamic executable"|cut -f 3 -d " "|sort|uniq|sed 1d
 else
  echo "$item is NOT found, skip!"
 fi
done

# Копируем библиотеки
for item in $(cat /tmp/chroot_liblist | sort | uniq); do
 cp $item $HOMEDIR/lib/
done
# Подчищаем за собой
[ -f /tmp/chroot_liblist ] && rm /tmp/chroot_liblist

# Копируем оставшиеся необходимые файлы и библиотеки
for i in /etc/termcap \
    /etc/resolv.conf \
    /etc/nsswitch.conf \
    /libexec/ld-elf.so.1 \
    /libexec/ld-elf32.so.1; do
 cp $i $HOMEDIR$i
done

# если копировали mc, то копируем все необходимые для mc файлы.
for i in /usr/local/share/mc \
    /usr/local/libexec/mc \
    /usr/local/etc/mc \
    /usr/local/man \
    /usr/share/man \
    /usr/share/groff_font \
    /usr/share/tmac; do
 cp -R $i $HOMEDIR$i
done

# Если копировали mysql клиента, то настроим дефолтные опции.
echo '
[client]
port=3306
host=192.168.120.2' >$HOMEDIR/usr/local/etc/my.cnf

# Генерируем /etc/motd для chroot окружения
echo 'Welcome to chroot environment' > $HOMEDIR/etc/motd

# Генерируем csh.cshrc для chroot окружения
echo 'setenv TERMCAP /etc/termcap' > $HOMEDIR/etc/csh.cshrc
cp /.cshrc $HOMEDIR/home/$USER/

#т.к. man требует зачем-то наличие /sbin/sysctl, то создаем заглушку - пустой файл с правами запуска.
[ ! -d $HOMEDIR/sbin/ ] && mkdir $HOMEDIR/sbin
[ ! -x $HOMEDIR/sbin/sysctl ] && chmod +x $HOMEDIR/sbin/sysctl

# Генерируем /etc/group для chroot окружения
grep $GID /etc/group > $HOMEDIR/etc/group

# Переносим запись о пользователе
grep "^$USER:" /etc/master.passwd > $HOMEDIR/etc/master.passwd
pwd_mkdb -d $HOMEDIR/etc $HOMEDIR/etc/master.passwd

# Выставляем права
chown root:wheel $HOMEDIR
chmod 755 $HOMEDIR
chmod 777 $HOMEDIR/tmp

for i in $SKEL; do
 chown -R $USER:$GID $HOMEDIR$i
done
Затем запускаем скрипт, указывая пользователя web:
FreeBSD# sh add_ssh_chrootuser.sh web
В каталоге /home/web будет создана структура каталогов системы и будут скопированы программы и все необходимые для их запуска библиотеки. В скрипте я копирую минимальный набор, которого хватает для чтения логов nginx, работы с mysql и некоторые другие программки - например mc. Перезапускаем демона sshd:
FreeBSD# service sshd restart
Stopping sshd.
Starting sshd.
Все готово! Можно подключаться под созданными учетными записями.
Пользователь web при подключении по ssh, попадет в chroot окружение, которое было создано скриптом, а пользователь sftp не сможет входить по ssh, но сможет сводобно работать по sftp протоколу, и самое главное, для него будет коневым каталогом /usr/local/www, за его пределы он не сможет выйти.

P.S. Важно, чтобы права на chroot директории были chmod 755 и владелец root:wheel, в противном случае пользователи не смогут войти.
Ссылки по теме:
1. lissyara.su - "Использование sftp+chroot из openssh в качестве альтернативы ftp-серверу."
2. WOLAND's blog - "BASH. Создание chroot окружения для SSH chroot в FreeBSD."
3. Forums.freebsd.org - [Solved] sftp/scp chroot solution?
4. Hilink - "chroot ssh доступ. Настройка."
5. Под защитой песочного демона (Евгений Зобнин) - Хакер, номер #093, стр. 093-118-4
6. opennet.ru - "ssh chroot"

пятница, 8 марта 2013 г.

Работа с текстом во FreeBSD dos2unix, unix2dos, удаление BOM в консоли.

Замена текста: Способ 1: Замена подстроки с помощью ПЕРЛ
perl -e 's/Pavel/Misha/g' -pi ./index.html
Способ 2: Замена с помощью sed
sed -e 's/Pavel/Misha/g'  ./index.html > index_new.html
Способ 3: Замена с помощью awk
awk '{gsub("Pavel","Misha",$0); print > FILENAME}' ./index.html
Полезные функции для работы с файлами:
dos2unix() {
 sed -i '' -e 's/'"$(printf '\015')"'$//g' "$2"
}

unix2dos() {
 sed -i '' -e 's|$|'"$(printf '\015')"'|g' "$2"
}

delete_BOM() {
# awk '{sub(/^\xEF\xBB\xBF/,"",$0); print > FILENAME}' "$1"
 awk '{sub(/^\xEF\xBB\xBF/,"",$0); print}' "$1" >> "${1}.awkbak"
 mv "${1}.awkbak" "$1"
}

#По 1 файлу
dos2unix -o russian.php
delete_BOM russian.php

# Найти и обработать все *.tpl и *.php файлы от текущего каталога.
for i in $(find . -type f \( -name '*.tpl' -o -name '*.php' \) -print); do
 echo 'Working: '$i'...'
 dos2unix -o $i
 delete_BOM $i
done
dos2unix -o для обратной совместимости с одноименной консольной утилитой /usr/ports/converters/unix2dos, но зачем засорять систему лишними пакетами, если можно обойтись встроенными средствами?

P.S. Если кто-то подскажет более изящное решение на awk, sed или еще чем-то, что идет штатно во FreeBSD для удаления BOM, буду только рад :) Варианты с perl не предлагать, они очевидны и не интересны :)
Первый вариант с awk почему-то не работает, часть файла теряется.
FreeBSD Подсказывает в motd вариант на sed:
sed -e '1s/^\xef\xbb\xbf//' < bomfile > newfile

среда, 30 января 2013 г.

Ubuntu Unity Midnight Commander и F10

Для возвращения нормальной работы в терминале кнопки F10 нужно выполнить команды в терминале:
Ubuntu$ gconftool --set --type bool "/apps/gnome-terminal/global/use_menu_accelerators" "false"
Ubuntu$ gconftool --set --type string "/apps/compiz-1/plugins/unityshell/screen0/options/panel_first_menu" Disabled
А для Ubuntu 12.04 понадобится создать файл gtk.css в папке .config/.gtk-3.0 в домашнем каталоге:
Ubuntu~$ mkdir -p .config/gtk-3.0
Ubuntu~$ cat >>.config/gtk-3.0/gtk.css<<_EOF
@binding-set NoKeyboardNavigation {
unbind "F10"
}

* {
gtk-key-bindings: NoKeyboardNavigation
}
_EOF
Затем нужно завершить сеанс и войти заново - теперь клавиша F10 работает так, как и хотелось.
P.S. если ничего не получилось, то на крайний случай можно пользоваться комбинацией клавиш ESC+0, кстати эти комбинации работают и для других F кнопок.

Ubuntu Gnome-Terminal - включение beep enable system-beep, audible ping, bell, подавать гудок.

Первым делом необходимо установить утилиту beep:
Ubuntu~$ sudo apt-get install beep
Затем нужно разрешить загрузку модуля pcspkr:
Ubuntu~$ sudo sed -i'' -e 's/blacklist pcspkr/#blacklist pcspkr/' /etc/modprobe.d/blacklist.conf
Либо, если Beep поддерживает звуковая карта ноутбука, попробовать активировать эту функцию:
Ubuntu~$ cat >>/etc/modprobe.d/alsa-base.conf<<_EOF

#Enable Beep
#https://bugs.launchpad.net/ubuntu/+source/beep/+bug/144022
options snd-hda-intel power_save=10 power_save_controller=Y index=0 beep_mode=1
_EOF
Для включения сигналов в gnome-terminal нужно включить в metacity параметр audible_bell и в самом gnome-terminal проверить наличие галочки "Подавать гудок".
Я сделал это через консоль:
Ubuntu~$ gconftool-2 --set --type bool "/apps/gnome-terminal/profiles/Default/silent_bell" "false"
Ubuntu~$ gconftool-2 --set --type string "/apps/metacity/general/audible_bell" "on"
Ubuntu~$ gsettings set org.gnome.desktop.wm.preferences audible-bell 'true'
Ubuntu~$ gconftool-2 --set --type string "/desktop/gnome/peripherals/keyboard/bell_mode" "on"
Ubuntu~$ gsettings set org.gnome.settings-daemon.peripherals.keyboard bell-mode 'on'
Проверяем:
Ubuntu~$ echo -e "\a"
Ubuntu~$ echo -e '\a'
Ubuntu~$ ping -a ya.ru
У меня после этих манипуляций был слышен звук, как и в системной консоли.
Регулировать громкость сигнала можно через alsamixer в консоли - параметр Beep, у меня он почему-то был почти около нуля и я добавил громкости.
Но радоваться рано, после перезагрузки гудок пропал. Выяснилось, что если отключить гудок и включить его снова, то все работает, но до следующей перезагрузки :(
Ubuntu~$ gsettings set org.gnome.desktop.wm.preferences audible-bell 'false'
Ubuntu~$ gsettings set org.gnome.desktop.wm.preferences audible-bell 'true'
Ubuntu~$ echo -e '\a'
Немного подумав, сделал такой костыль:
Ubuntu~$ cat >>~/.bashrc<<_EOF
if [ -n $DISPLAY ]; then
    gsettings set org.gnome.desktop.wm.preferences audible-bell 'false'
    gsettings set org.gnome.desktop.wm.preferences audible-bell 'true'
fi
_EOF
Буду крайне признателен, если кто-то подскажет более изящное решение.

P.S. Может кому пригодится, приведу еще дополнительные опции из gconftool и gsettings:
Ubuntu~$ gsettings list-recursively | grep bell
org.gnome.desktop.wm.preferences audible-bell true
org.gnome.desktop.wm.preferences visual-bell false
org.gnome.desktop.wm.preferences visual-bell-type 'fullscreen-flash'
org.gnome.settings-daemon.peripherals.keyboard bell-custom-file ''
org.gnome.settings-daemon.peripherals.keyboard bell-duration 100
org.gnome.settings-daemon.peripherals.keyboard bell-mode 'on'
org.gnome.settings-daemon.peripherals.keyboard bell-pitch 400

Ubuntu~$ gconftool -R /desktop | grep -B4 bell
  /desktop/gnome/peripherals:
   /desktop/gnome/peripherals/keyboard:
    repeat = true
    delay = 500
    bell_mode = off
    bell_custom_file = (значение не установлено)
    remember_numlock_state = true
    click_volume = 0
    click = true
    bell_pitch = 400
    bell_duration = 100

Ubuntu~$ gconftool -R /apps | grep -B20 bell

Ссылки по теме:
1. Comment 50 for bug 486154
2. Trying to ENABLE bell in gnome-terminal
3. Comment 18 for bug 144022