참고 : 이것은 주로 내가 만든 프로그램 (쉘 스크립트) 이며이 포럼은 프로그램 소개 사이트보다 질문 답변 사이트라는 것을 알고 있습니다. 그러나 나는 GitHub (또는 유사한) 계정이 없으며 오픈 소스 프로그램을 커뮤니티에 게시하는 방법에 대해 조사 할 시간이 없었습니다. 따라서, 유용하고 유용한 프로그램이 그것을 즐길 수있는 사람들에게 눈에 띄지 않게하는 위험이있는 한, 이미 작성된 프로그램을 공유하지 않는 것이 슬프다면, 여기 에 게시 할 것 입니다. 지금. 관리자 가이 스레드를 제거하기로 결정하면 아무런 문제가 없습니다. 나는에 문제를 모호하게 한 희망
질문 - 답변 이 포럼에 유용하게 방법 충분히. 충분하다면관심있는 사용자 , 나는 프로젝트 를 계속 하기 위해 시간을 할애하기 위해 최선을 다할 것입니다 (모든 연구 후에 인터넷에서 가장 가까운 것을 찾지 못했지만 글쎄 ... 스크립트가 가치가 있는지 또는 잘 모르겠습니다. 시간 낭비였습니다).
CygWin에서 작동 하고 간단한 CygWin 시간 공격 간격에 대한 SUDO를 줄이는 데 도움이 되는 간단한 Linux 셸 스크립트 를 프로그래밍했습니다 . 이 프로그램의 이름은 TOUACExt ( " TimeOut 및 UAC Extension "의 약자 )이며 CygWin 용 SUDO (설치해야 함) 의 래퍼 역할을하며 실제로 4 개의 .sh
프로그램 으로 구성됩니다 .
특징 :
- 편안한 사용법 : Linux 동작에서 원래 sudo를 시뮬레이션하면 UAC 확인 요청 프롬프트가 한 번만 나타납니다 (여러 개의 연속 된
sudo
명령은 하나의 UAC 요청 만 생성 함). sudoserver.py가 계속 실행되는 동안 (기본값 15 분) 더 이상 UAC 요청 이 없습니다 .
- 권한있는 (관리자) 사용자 는 화면에서 UAC 확인 요청 ( 예 / 아니요 ) 만 받습니다 .
- 권한이없는 (관리자가 아닌) 사용자 에게는 관리자 계정 / 암호 입력 화면이 나타납니다.
- sudoserver.py는 계속 실행되고 마지막 sudo 명령 실행에서 사전 정의 된 시간 (15 분) 후에 자동으로 닫힙니다 .
- sudo가 실행중인 경우 sudoserver.py가 닫히지 않습니다 (실행을 유지하고 5 분 후에 다시 확인) .
- 원격으로 작동 (SSH를 통해 테스트) :
- 권한이없는 사용자 는 sudoserver.py를 원격으로 시작할 수 없습니다.
- 에 (단순하고 읽기 어려운) 로그 를 작성
/var/log/SUDOForCygWin/
합니다.
요구 사항 (CygWin) :
- CygWin을위한 SUDO .
- pgrep (
procps
패키지).
- 무리 (
util-linux
패키지).
- nohup ( CygWin 에 기본적 으로 설치되어 있다고 생각 하지만 확실하지는 않습니다).
가정 :-저자가 제안한 경로에 대한 SUDO for 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
직접 윈도우에서 요청할 수 있습니다 :
c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py
TOUACExt 의 네 개의 .sh 스크립트를 경로에 넣으십시오. 예를 들면 다음과 같습니다.
/usr/local/bin/SUDO.sh
/usr/local/bin/SUDOServer.sh
/usr/local/bin/SUDOServerWatchDog.sh
/usr/local/bin/SUDOServerWatchDogScheduler.sh
원래 이름 바꾸기 에서 파이썬 스크립트 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
NOTE2 :이 스크립트는 베타 버전으로 출시되었으므로 여전히 버그가 있으며 코드가 깨끗하지 않습니다. 어쨌든, 세 가지 다른 Windows 7 컴퓨터를 사용한 테스트에서 작동하는 것처럼 보입니다 (대부분).
프로그램에 대한 간단한 설명 :
- 별명으로 인해 sudo 명령을 수행 할 때 SUDO.sh 스크립트 가 호출됩니다.
- SUDO.sh 는
SUDOServer.lnk
필요한 경우 "sudoserver.py" 를 열어 SUDOServer.sh를 호출 합니다.
- 원래 Sudo 명령 사용자가 호출이 실행됩니다.
- 그런 다음 SUDO.sh 는 SUDOServerWatchDogScheduler.sh를 호출 하여 지정된 시간 (기본값 15 분) 이후에 SUDOServerWatchDog.sh가 실행되도록 예약
sudoserver.py
합니다.
- 미리 정의 된 시간 후에 SUDOServerWatchDog.sh는 sudoserver.py를 닫습니다 . 실행중인 sudo 인스턴스 가 있으면 5 분 후에 새로 실행되도록 자체 프로그램됩니다.
해야 할 일 :
- 모든 .sh, .cmd 및 .lnk 파일을 자동으로 작성하는 자체 설치 프로그램 .
- 다른 잠금 파일 을 설정 하십시오 ($ TMP / lockfile.lck에 있음).
- 구성 스크립트 또는 .config 파일을 추가 하십시오 (기본값은 시간 초과, 파일 위치 등).
- 시스템 계정 동작 추가 (@ Wyatt8740 덕분에).
- ¿ 적절한 경우 "fuser"로 "flock"(내부 잠금 SUDO 모드)을 변경 하시겠습니까?
- 제안이 수락되었습니다.
보고 된 버그 :
- bash 쉘 은 닫힐 때까지 실행중인
exit
경우 입력 한 후에도 계속 열려 sudoserver.py
있습니다. 임시 해결 방법을 환영합니다.
나는 희망을 누군가가 사용 나는 TOUACExt에 전념 한 프로그램 긴 시간.
개선 및 수정이 허용됩니다. 이 포럼의 잔소리를 멈추기 위해 코드를 게시 해야하는 위치
에 대한 제안 도 허용됩니다 ;-).
긴 글에 대해 죄송합니다. 나는 자유 시간이 많지 않으며이 프로젝트는 옷장에서 사라질 것입니다.