Украинская Баннерная Сеть

Рубрика архива: bash

BASH. Создание chroot окружения для SSH chroot в FreeBSD.
#!/usr/local/bin/bash

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


USER=$1
GID=`cat /etc/master.passwd | grep "^$USER:" | cut -d ":" -f 4`
HOMEDIR=/home/$USER

# Задаем список бинарных файлов,
# которые хотим предоставить пользователю
BINARIES="
/bin/cat \
/bin/chmod \
/bin/cp \
/bin/csh \
/bin/date \
/bin/echo \
/bin/expr \
/bin/ln \
/bin/ls \
/bin/mkdir \
/bin/mv \
/bin/ps \
/bin/pwd \
/bin/rm \
/bin/rmdir \
/bin/sh \
/usr/bin/awk \
/usr/bin/bzip2 \
/usr/bin/diff \
/usr/bin/du \
/usr/bin/ee \
/usr/bin/fetch \
/usr/bin/find \
/usr/bin/grep \
/usr/bin/gunzip \
/usr/bin/gzip \
/usr/bin/less \
/usr/bin/sed \
/usr/bin/sort \
/usr/bin/tail \
/usr/bin/tar \
/usr/bin/touch \
/usr/bin/vi \
/usr/local/bin/bash \
/usr/local/bin/mc \
/usr/local/bin/mcedit \
/usr/local/bin/mcmfmt \
/usr/local/bin/unrar \
/usr/local/bin/unzip \
/usr/local/bin/wget"


# Создаем структуру каталогов внутри chroot окружения
mkdir $HOMEDIR/bin
mkdir $HOMEDIR/etc
mkdir $HOMEDIR/home
mkdir $HOMEDIR/home/$USER
mkdir $HOMEDIR/lib
mkdir $HOMEDIR/libexec
mkdir $HOMEDIR/tmp
mkdir $HOMEDIR/usr
mkdir $HOMEDIR/usr/bin
mkdir $HOMEDIR/usr/local
mkdir $HOMEDIR/usr/local/bin
mkdir $HOMEDIR/usr/local/etc
mkdir $HOMEDIR/usr/local/share

# Копируем бинарники внутрь chroot окружения
for item in $BINARIES;
do
  cp $item $HOMEDIR$item
done

# Определяем какие библиотеки необходимо скопировать
for item in $BINARIES;
do
  ldd $item |awk '{print $3}'|grep "."  >> /tmp/chroot_liblist
done

# Копируем библиотеки
for item in `cat /tmp/chroot_liblist|sort|uniq`;
do
  cp $item $HOMEDIR/lib/
done

# Копируем оставшиеся необходимые файлы и библиотеки
cp /etc/termcap $HOMEDIR/etc/termcap
cp /etc/resolv.conf $HOMEDIR/etc/resolv.conf
cp /etc/nsswitch.conf $HOMEDIR/etc/nsswitch.conf
cp -R /usr/local/share/mc $HOMEDIR/usr/local/share/mc
cp /libexec/ld-elf.so.1 $HOMEDIR/libexec/ld-elf.so.1
cp /libexec/ld-elf32.so.1 $HOMEDIR/libexec/ld-elf32.so.1

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

# Генерируем /etc/profile для chroot окружения
echo 'export TERMCAP=/etc/termcap' > $HOMEDIR/etc/profile
echo 'export PS1="[ w ]$ "' >> $HOMEDIR/etc/profile

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

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

# Выставляем права
chown root:wheel  $HOMEDIR
chmod 755 $HOMEDIR
chown -R $USER:$GID $HOMEDIR/bin
chown -R $USER:$GID $HOMEDIR/etc
chown -R $USER:$GID $HOMEDIR/home
chown -R $USER:$GID $HOMEDIR/lib
chown -R $USER:$GID $HOMEDIR/libexec
chown -R $USER:$GID $HOMEDIR/tmp
chown -R $USER:$GID $HOMEDIR/usr
chmod 777 $HOMEDIR/tmp

# Подчищаем за собой
rm /tmp/chroot_liblist
BASH. Добавление системного пользователя в FreeBSD.

Если мы решим написать скрипт для автоматизированного добавления системных пользователей, то неминуемо столкнемся с двумя вопросами.

1. Как установить пользователю пароль?
Утилиты adduser и passwd являются интерактивными и мы не сможем передать им пароль параметром. Прийдется либо вводить пароль вручную, либо исхитрятся с expect. На помощь может прийти неинтерактивная утилита pw. Если вызывать pw с флагом “-h 0″, то утилите можно передавать пароль из командной строки, примерно так: “echo secret | pw useradd someuser -h 0″.

2. Как сгенерировать пароль?
Для генерации пароля можно воспользоватся утилитами типа pwgen, но для этого потребуется установить pwgen из /usr/ports/. Чтобы ничего не устанавливать можно воспользоваться штатными средствами и использовать /dev/urandom в качестве источника для генерации символов. Команда генерации пароля из восьми символов будет выглядеть так: “cat /dev/urandom | tr -dc a-zA-Z0123456789 | head -c 8″. Я намеренно использовал конструкцию a-zA-Z0123456789, а не a-zA-Z0-9. Дело в том, что по пока непонятным мне причинам при задании 0-9 в некоторых случаях в паролях присутствует символ “*” (проверялось на FreeBSD 6.2, как в остальных версиях – не знаю).

Теперь мы можем перейти к написанию скрипта для добавления системных пользователей. Приведу пример самого простенького скрипта.

#!/usr/local/bin/bash

if [ -z "$3" ]; then
echo "usage: $0   "
exit
fi

u_name="$1"
u_class="$2"
u_shell="$3"
pass=`cat /dev/urandom | tr -dc a-zA-Z0123456789 | head -c 8`

echo "$pass"|pw useradd -n $u_name -L $u_class -s $u_shell -h 0
mkdir /home/$u_name
chown $u_name:$u_name /home/$u_name
echo "User $u_name succesfully added with password $pass"

Украинская Баннерная Сеть
Hosting Catalog Rambler's Top100