Рубрика: Павел
Архив статей и записей написанных Грибовым Павлом
Ограничение пользователя SSH / SFTP домашним каталогом FreeBSD 10.4
Бывает ситуации, когда нужно дать доступ на сервер, но не желательно допустить, чтобы он видел «лишнее». Для этого можно ограничить пользователя домашним каталогом по ssh и sftp. Что нужно сделать для этого:
1) Создать пользователя:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
root@w34rw34:~ # adduser test Username: test Full name: test test Uid (Leave empty for default): Login group [test]: Login group is test. Invite test into other groups? []: Login class [default]: Shell (sh csh tcsh nologin) [sh]: Home directory [/home/test]: 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]: yes Lock out the account after creation? [no]: Username : test Password : <random> Full Name : test test Uid : 1005 Class : Groups : test Home : /home/test Home Mode : Shell : /bin/sh Locked : no OK? (yes/no): yes adduser: INFO: Successfully added (test) to the user database. adduser: INFO: Password for (test) is: 34rfw34rfw34 Add another user? (yes/no): no Goodbye! |
2) В /etc/ssh/sshd_config добавляем следующие строчки:
1 2 |
Match user test ChrootDirectory /home/test |
Перестартуем sshd:
1 |
/etc/rc.d/sshd restart |
3) Ниже приведенным скриптом создадим «пользовательское окружение», т.е. фактически создадим набор команд шелла, доступных пользователю:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
#!/bin/sh # В скрипт нужно передавать имя пользователя для которого создаем chroot окружение if [ "$1" = "" ] ; then echo " Usage: $0 [ username ]" exit fi USER=$1 GID=`cat /etc/master.passwd | grep "^$USER:" | cut -d ":" -f 4` HOME=/usr/home/$USER # Задаем список бинаников, нужных для работы в chroot BINS=" /usr/local/bin/mysql \ /bin/cat \ /bin/chmod \ /bin/cp \ /bin/csh \ /bin/date \ /bin/df \ /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/scp \ /usr/bin/ssh \ /usr/bin/tail \ /usr/bin/tar \ /usr/bin/touch \ /usr/bin/vi \ /usr/bin/uname \ /usr/bin/uptime \ /usr/local/bin/mc \ /usr/local/bin/mcedit \ /usr/local/bin/mcmfmt \ /usr/local/bin/unrar \ /usr/local/bin/unzip \ " # Создаем структуру каталогов chroot окружения mkdir $HOME/bin mkdir $HOME/etc mkdir $HOME/home mkdir $HOME/home/$USER mkdir $HOME/lib mkdir $HOME/libexec mkdir $HOME/tmp mkdir $HOME/usr mkdir $HOME/usr/bin mkdir $HOME/usr/local mkdir $HOME/usr/local/bin mkdir $HOME/usr/local/etc mkdir $HOME/usr/local/share mkdir $HOME/lib # Копируем бинарники в chroot окружение for item in $BINS; do cp $item $HOME$item done # Копируем всю папку /lib cp /lib/* $HOME/lib/ # Определяем какие библиотеки необходимо скопировать chroot for item in $BINS; do ldd $item |awk '{print $3}'|grep "." >> /tmp/libs done # Копируем библиотеки for item in `cat /tmp/libs|sort|uniq`; do cp $item $HOME/lib/ done # Копируем оставшиеся необходимые файлы и библиотеки cp /etc/termcap $HOME/etc/termcap cp /etc/resolv.conf $HOME/etc/resolv.conf cp /etc/nsswitch.conf $HOME/etc/nsswitch.conf cp -R /usr/local/share/mc $HOME/usr/local/share/mc cp /libexec/ld-elf.so.1 $HOME/libexec/ld-elf.so.1 # Создадим /etc/motd для пользователя echo "Welcome $USER" > $HOME/etc/motd # Теперь /etc/profile для него же echo 'export TERMCAP=/etc/termcap' > $HOME/etc/profile echo 'export PS1="$ "' >> $HOME/etc/profile # /etc/group тоже нужен свой cat /etc/group | grep $GID > $HOME/etc/group # Теперь внутри chroot создадим пользователя cat /etc/master.passwd|grep "^$USER:" > $HOME/etc/master.passwd pwd_mkdb -d $HOME/etc $HOME/etc/master.passwd # Выставляем права chown root:wheel $HOME chmod 755 $HOME chmod 755 $HOME chown -R $USER:$GID $HOME/bin chown -R $USER:$GID $HOME/etc chown -R $USER:$GID $HOME/home chown -R $USER:$GID $HOME/lib chown -R $USER:$GID $HOME/libexec chown -R $USER:$GID $HOME/tmp chown -R $USER:$GID $HOME/usr chmod 777 $HOME/tmp # Убираем за собой rm /tmp/libs |
5) Если необходимо сделать доступными пользователю еще какието папки (например из /usr/local/www/apache2, можно воспользоваться командой локального монтирования:
1 |
mount_nullfs /usr/local/www/apache24/sites/abc/ /home/test/home/test/site/ |
Drupal: Несоответствие определений сущности и/или поля
Устанавливаем модуль Devel, становится доступна консоль выполнения php из админки, по адресу http://сайт/devel/php . В нем выполняем следующий код:
1 2 3 4 5 6 |
try { \Drupal::entityDefinitionUpdateManager()->applyUpdates(); } catch (EntityStorageException $e) { print_r($e); } |
Unable to negotiate with X.X.X.X port 22: no matching cipher found.
Такая ошибка возникает если не согласованы протоколы безопасности на серверах. В моем случае было достаточно в /etc/ssh/ssh_config раскомментировать строчку Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
Многопоточный опрос уровней абонентов станций GPON OLT
На выходе скрипт обновляет таблицу в MySQL, уровнем сигнала:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
#!/usr/local/bin/python # coding=utf-8 import mysql.connector from mysql.connector import Error import config import func import socket import re from tendo import singleton from pysnmp.hlapi import * import threading import time vr="1.0" info="Сей дивный скрипт лезет snmp запросом на свичи olt/pon и опрашивает уровни" copyleft="(с) 2018 by Pavel Gribov, http://грибовы.рф"; #выводим имя ПК и версию скрипта hostname = socket.gethostname() print "Server: ",hostname print "Version: ",vr print "info: ",info print "Copyright: ",copyleft workcount=50; #количество потоков для опроса def GetArrayLevels(ip,comm,oid): res=None errorIndication, errorStatus, errorIndex, varBinds = next( getCmd(SnmpEngine(), CommunityData(comm), UdpTransportTarget( (ip, 161), timeout=2.0, retries=0 ), ContextData(), ObjectType(ObjectIdentity(oid))) ) if errorIndication: print("Ошибка:",ip,comm,oid,errorIndication) return res elif errorStatus: print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) return res else: for varBind in varBinds: if varBind[1]<0: res=varBind[1] return res def worker(ip,community,ind,idr): rz=GetArrayLevels(ip,community,".1.3.6.1.4.1.3320.101.10.5.1.5."+str(ind)) try: conn2 = mysql.connector.connect(host=config.noc_host,database=config.noc_base,user=config.noc_user,password=config.noc_pass) #if conn2.is_connected(): func.putlog('--cоединение с БД '+config.noc_base+' установлено') except Error as e: print("Ошибка: ",e); exit(0); finally: if rz!=None: print ("Level:",rz); sql="update oltlevels set level=%s,lastmod=now() where id=%s"; print ("update oltlevels set level="+str(rz)+" where id="+str(idr)) ccr = conn2.cursor(dictionary=True,buffered=True) ccr.execute(sql,[str(rz),idr]); conn2.commit(); conn2=None func.putlog("-скрипт стартовал"); func.putlog("--проверяю, а не запущены ли мы уже?"); try: me = singleton.SingleInstance() except: func.putlog("--мы уже запущены!"); exit(1) func.putlog("--Ок. Одна копия, работаем дальше"); func.putlog("--соединяемся с noc"); try: conn = mysql.connector.connect(host=config.noc_host,database=config.noc_base,user=config.noc_user,password=config.noc_pass) if conn.is_connected(): func.putlog('--cоединение с БД '+config.noc_base+' установлено') except Error as e: print("Ошибка: ",e); exit(0); finally: func.putlog("---делаем выборку устройств для опроса"); sql="select * from oltlevels order by rand()"; cursor = conn.cursor(dictionary=True,buffered=True) cursor.execute(sql); row = cursor.fetchone() while row is not None: ip=row["ip"] community=row["community"] idr=row["id"] ind=row["ind"] func.putlog("----опрашиваем "+str(ip)+" ind="+str(ind)+",id="+str(idr)); thread = threading.Thread(target=worker, args=(ip,community,ind,idr,)).start() while threading.active_count() >workcount: time.sleep(1) row = cursor.fetchone() while threading.active_count() >workcount: time.sleep(1) func.putlog("---закончили"); |