ПРИМІТКА. Це, здебільшого, програма (скрипт оболонки), яку я створив, і я знаю, що цей форум - це скоріше сайт із запитаннями, ніж відповідь на впровадження програм. Але я не маю жодного облікового запису GitHub (або подібного), а також не мав часу досліджувати спосіб публікації програми з відкритим кодом для громади. Таким чином, до тих пір , поки існує ризик того, що робоча і корисна програма зберігає непомітно (навіть в протягом декількох місяців) для тих , хто міг би насолоджуватися цим, і було б сумно не розділяти вже зробив програму, я збираюся опублікувати його тут для зараз. Немає проблем для мене, якщо адміністратори вирішать видалити цю тему, я зрозумію. Я сподіваюсь, що я сформулював це
питання достатньо, щоб зробити його корисним для цього форуму. Якщо їх достатньозацікавлені користувачі , я зроблю все можливе, щоб приділити деякий час для продовження проекту (після всіх моїх досліджень я не знайшов нічого найбільш близького до цього в Інтернеті, але, ну ... я не знаю, чи мій сценарій цінний чи це було марною тратою часу).
Я запрограмував простий скрипт оболонки Linux, який працює (до цих пір) на CygWin і допомагає (сподіваюся) скорочуючи інтервал часу атаки SUDO для CygWin. Програма має назву TOUACExt (абревіатура " TimeOut та UAC Extension ") і виступає в якості обгортки для SUDO для CygWin (потрібно встановити), і справді складається з набору з чотирьох .sh
програм.
Особливості :
- Зручне використання : імітуючи оригінальний sudo з поведінки Linux, запит на підтвердження UAC з'являється лише один раз (кілька послідовних
sudo
команд генерують лише один запит UAC). Поки sudoserver.py не працює (за замовчуванням 15 хвилин), більше не буде запитів UAC .
- Привілейовані користувачі (Адміністратор) отримують на екрані лише запит на підтвердження UAC ( Так / Ні ).
- Непривілейовані (не-адміністратори) користувачі отримують екран введення облікового запису адміністратора / пароля .
- sudoserver.py продовжує працювати, а потім автоматично закривається через попередньо визначений час (15 хвилин) від останнього виконання команди sudo.
- sudoserver.py не закривається (продовжує працювати і знову перевіриться через 5 хвилин) у разі будь-якого екземпляра запуску sudo .
- Працює віддалено (тестується через SSH):
- Непривілейовані користувачі не можуть запускати sudoserver.py віддалено.
- Створює (але простий і не дуже читабельний) журнал у
/var/log/SUDOForCygWin/
.
Вимоги (у CygWin):
- SUDO для CygWin .
- pgrep (на
procps
упаковці).
- зграя (на
util-linux
упаковці).
- nohup (я думаю, встановлений за замовчуванням на CygWin, але не впевнений).
Припустимо : - Дві програми проекту SUDO для CygWin на шляху, запропонованому автором:
/usr/local/bin/sudoserver.py
/usr/local/bin/sudo
TOUACExt пройшли тестування на Windows 7 SP1 та Windows XP SP3, але я не знаю, чи є сенс використовувати його на останньому.
Інструкція з установки :
Помістіть цей скрипт (запропоноване ім'я SUDOServer.cmd
:) та створіть ярлик (ви можете персоналізувати його значок, якщо хочете) до його імені SUDOServer.lnk
(потрібно ввімкнути цей ярлик Advanced Options --> Execute as Administrator
) в будь-якому місці вашого шляху Windows , щоб його sudoserver.py
можна було запитувати безпосередньо в Windows:
c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py
Покладіть на шлях чотири .sh- сценарії TOUACExt , наприклад:
/usr/local/bin/SUDO.sh
/usr/local/bin/SUDOServer.sh
/usr/local/bin/SUDOServerWatchDog.sh
/usr/local/bin/SUDOServerWatchDogScheduler.sh
Перейменуйте вихідний сценарій Python від sudo
до sudo.py
:
mv /usr/local/bin/sudo /usr/local/bin/sudo.py
ПОПЕРЕДЖЕННЯ: Оригінальний скрипт "sudo" Python не повинен залишатися ніде на вашому шляху, інакше він може бути виконаний натомість.
Створіть цей псевдонім (наприклад, вручну або відредагувавши свій ~/.bashrc
):
alias sudo='SUDO.sh'
Код для SUDO.sh :
#!/bin/bash
# ********** SUDO.sh v0.04a **********
# Variables:
# LockFile (will use a temporal one for now):
#lockfile=sudoserver-running.lck
LockFile=lockfile.lck
# Creating LogFile (if it does not exist):
mkdir /var/log/SUDOForCygWin 2>/dev/null
chmod 777 /var/log/SUDOForCygWin 2>/dev/null
LogFile=/var/log/SUDOForCygWin/$(date +%Y%m%d).log
exec 5>>$LogFile # Redirector 5 will be the log file.
chmod 777 $LogFile >&5 2>&5 # Writable to anyone (for now).
# Start of the program
echo "========== Starting SUDO Server for CygWin ==========" >&5
echo $(date) >&5
# does the lock file exists as locked?
if [ $(flock -n $TMP/$LockFile echo>/dev/null;echo $?) -eq 0 ]
then
# The lock file is not locked.
echo "LockFile not locked. Testing sudo access..." >&5
if [ $(sudo.py vartemp=0>/dev/null 2>/dev/null;printf $?) -eq 0 ]
then
# Wooops. sudoserver.py is running without the lockfile. Better to correct this.
echo "LockFile not locked, but sudoserver.py seems to be running." >&5
printf "Killing sudoserver.py...\n" >&5
sudo.py kill $(sudo.py pgrep.exe -f -l sudoserver.p[y] | grep "pgrep" -v | awk '{print $1}') >&5 2>&5
fi
# Starting SUDOServer.sh
printf "Requesting SUDOServer start...\n" >&5
nohup SUDOServer.sh >&5 2>&1&
# Wait some time delay for UAC Prompt to start
sleep 2
timeout=$((SECONDS+10))
# Has sudoserver.py already started?
while [ $(flock -w 1 $TMP/$LockFile echo>/dev/null;printf $?) -eq 0 ] || [ $(tasklist | grep "consent.exe" -i>/dev/null;printf $?) -eq 0 ]
do
# No. We have to wait.
# Waiting for SUDOServer.py to be running.
printf "."
if [ $SECONDS -ge $timeout ]
then
# sudoserver.py not responding. Aborting with errorlevel=3.
printf "sudoserver.py not responding. Aborting.\n"
exit 3
fi
done
# Yes. sudoserver.py is up and running.
fi
printf "\n"
# Schedule (add) SUDOServer Watch Dog to Task Scheduler:
SUDOServerWatchDogScheduler.sh
# Invoke requested sudo command
sudo.py $@
#printf "ErrorLevel was: "$?
# ErrorLevel Codes:
# 3 --> timeout waiting for sudoserver.py to respond.
Код для SUDOServer.sh :
#!/bin/bash
# ********** SUDOServer.sh v0.04a **********
# Variables:
# LockFile (a temporal one for now):
#lockfile=sudoserver-running.lck
LockFile=lockfile.lck
# Check for other instances of sudoserver.py running
if [ $(flock -n $TMP/$LockFile echo>/dev/null;printf $?) -eq 0 ]
then
printf "Creating lockfile: "$TMP/$LockFile"\n"
flock $TMP/$LockFile -c 'cmd /c SUDOServer'
# The file has been unlocked. Send error level=2.
exit 2
else
printf "The lockfile: "$TMP/$LockFile" is locked by another process.\n"
printf "Exiting SUDOServer.sh"
fi
printf "SUDOServer.sh execution finished. Exiting."
# Exiting with no problems.
exit 0
# ErrorLevel Codes:
# 2 --> SUDOServer.lnk (maybe denial of UAC).
Код для SUDOServerWatchDog.sh :
#!/bin/bash
# ********** SUDOServerWatchDog.sh v0.04a **********
# Variables:
# LockFile (a temporal one for now):
#lockfile=sudoserver-running.lck
LockFile=lockfile.lck
# Redirecting to LogFile:
LogFile=/var/log/SUDOForCygWin/$(date +%Y%m%d).log
exec 5>>$LogFile
if [ $(stat $LogFile -c %a) -ne 777 ]
then
echo "Logfile "$LogFile" has incorrect permissions." >&5
echo "Attemping to change permissions of "$LogFile >&5
chmod 777 $LogFile >&5 2>&5
fi
# Remove Task Scheduler entry, if exists.
if [ $(schtasks.exe /query | grep "SUDOServerWatchDog" -i>/dev/null 2>&5;printf $?) -eq 0 ]
then
sudo.py schtasks.exe /delete /tn "SUDOServerWatchDog" /f >&5 2>&5
fi
# Is sudoserver.py running?
if [ $(flock -n $TMP/$LockFile echo>/dev/null;printf $?) -eq 1 ] || [ $(sudo.py vartemp=0>/dev/null 2>/dev/null;printf $?) -eq 0 ]
then
# Yes. sudoserver.py is running. So...
printf "sudoserver.py detected running...\n" >&5
# Is any instance of sudo running right now?
if [ $(sudo.py pgrep -f -l "/usr/local/bin/sudo.py " | grep -v grep>/dev/null 2>&5;printf $?) -eq 0 ]
then
# Yes. sudo is running right now. So...
printf "There are instances of sudo running.\n" >&5
sudo.py schtasks /create /tn "SUDOServerWatchDog" /tr "SUDOServerWatchDog" /sc minute /mo 5 /sd 10/10/2010 /ru "SYSTEM" >&5 2>&5
printf "Will check again in 5 minutes. Adding Task.\n" >&5
else
# No. sudo is not running right now. So...
# Kill sudoserver.py.
printf "Closing sudoserver.py\n" >&5
sudo.py kill $(sudo.py pgrep.exe -f -l sudoserver.p[y] | grep "pgrep" -v | awk '{print $1}')
fi
else
printf "sudoserver.py not running. Nothing to be done.\n" >&5
fi
Код для SUDOServerWatchDogScheduler.sh :
#!/bin/bash
# ********** SUDOWatchDogScheduler.sh v0.04a **********
# Check if WatchDog is already scheduled
if [ $(schtasks.exe /query | grep "SUDOServerWatchDog">/dev/null 2>&5;printf $?) -eq 0 ]
then
# Yes. Remove it in order to create a new one.
echo "Task SUDOServerWatchDog already existing." >&5
echo "Removing task SUDOServerWatchDog..." >&5
sudo.py schtasks.exe /delete /tn "SUDOServerWatchDog" /f >&5 2>&5
if [ $? -eq 0 ]
then
# Task correctly deleted.
echo "Task correctly removed." >&5
else
# Something failed in task creation. Report.
echo "ERROR on deleting the SUDOServerWatchDog programmed task." >&5
fi
fi
# Schedule new task for deletion.
echo "Adding new SUDOServerWatchDog task to trigger in 15 minutes." >&5
sudo.py schtasks /create /tn "SUDOServerWatchDog" /tr "SUDOServerWatchDog" /sc minute /mo 15 /sd 10/10/2010 /ru "SYSTEM" >&5 2>&5
if [ $? -eq 0 ]
then
# Task correctly scheduled.
echo "Task SUDOServerWatchDog correctly scheduled." >&5
else
# Something failed in task scheduling. Report.
echo "ERROR on scheduling programmed task SUDOServerWatchDog." >&5
fi
Перевірте програму на оболонці CygWin Bash:
Luis@Kenobi ~
$ sudo ls -la
<UAC ELEVATION PROMPT APPEARS>
total 49
drwxr-xr-x+ 1 Luis None 0 abr 7 02:23 .
drwxrwxrwt+ 1 Luis- None 0 abr 4 03:27 ..
-rw------- 1 Luis None 13798 abr 14 00:31 .bash_history
-rwxr-xr-x 1 Luis None 1494 mar 3 11:36 .bash_profile
-rwxr-xr-x 1 Luis None 6260 abr 6 05:19 .bashrc
-rwxr-xr-x 1 Luis None 1919 mar 3 11:36 .inputrc
-rw------- 1 Luis None 35 abr 2 01:43 .lesshst
-rwxr-xr-x 1 Luis None 1236 mar 3 11:36 .profile
drwx------+ 1 Luis None 0 mar 8 01:49 .ssh
-rw-r--r-- 1 Luis None 7 mar 4 18:01 d:ppp.txt
-rw-r--r-- 1 Luis None 37 abr 7 02:23 my.log
ПРИМІТКА2. Ці сценарії знаходяться в попередній бета-версії , тому вони все ще баггі і код не дуже чистий. У будь-якому випадку, на моїх тестах з трьома різними комп'ютерами Windows 7 вони, здається, працюють (здебільшого) гаразд.
Коротке пояснення програми:
- У зв'язку з псевдонімом, при виконанні команди SUDO SUDO.sh скрипт викликається.
- SUDO.sh називає SUDOServer.sh , відкриваючи (через
SUDOServer.lnk
) "sudoserver.py", якщо потрібно.
- Вихідна команда Sudo викликається користувачем виконується.
- Потім SUDO.sh викликає SUDOServerWatchDogScheduler.sh , який планує завершити виконання SUDOServerWatchDog.sh після заданого часу (15 хвилин за замовчуванням), щоб закрити
sudoserver.py
.
- Після визначеного часу SUDOServerWatchDog.sh закриває sudoserver.py . Якщо є якийсь екземпляр запуску sudo , він програмує себе на нове виконання через 5 хвилин.
Щоб зробити :
- Самостійний інсталятор, який автоматично створює всі .sh, .cmd та .lnk файли.
- Встановіть файл блокування для іншого (це на $ TMP / lockfile.lck).
- Додайте сценарій конфігурації або файл .config (для замовчувань у режимі очікування, розташування файлів ... тощо).
- Додайте поведінку системного облікового запису (спасибі, @ Wyatt8740).
- Змініть "стадо" (режим внутрішнього блокування SUDO) на "термоядер", де це доречно?
- Пропозиції прийняті.
Повідомлення про помилки :
- Оболонка bash залишається відкритою навіть після введення,
exit
якщо sudoserver.py
вона працює, поки вона не закриється. Тимчасові шляхи вирішення вітаються.
Я сподіваюся, що хтось використає довгі години програмування, яке я присвятив TOUACExt.
Покращення та виправлення прийняті.
Пропозиції щодо того, куди мені слід надрукувати код, щоб перестати нудити на цьому форумі, також прийняті ;-).
Вибачте за довгий пост. У мене мало багато вільного часу, і цей проект був про те, щоб зникнути в моїй шафі (можливо, роками, хто знає?).