"예상"을 stdin/stdout 상호 작용으로만 제한

"예상"을 stdin/stdout 상호 작용으로만 제한

기본적으로 사용자를 위해 실행할 프로세스와의 콘솔 상호 작용이 포함된 사용자의 작업 파일을 수락해야 합니다. 당연히 가장 먼저 떠오르는 아이디어는 expect스크립트를 작업 파일로 사용하는 것입니다.

spawn process
expect "ready"
send "process DATA"
set timeout 100
expect {
    "done" {send_user "success"}
    timeout {send_user "failure"}
}

하지만 자동으로 작업을 수락하고 싶기 때문에 사용자가 10개의 sysbench프로세스를 생성하거나 임의의 파일을 디스크에 쓰거나 읽으려고 하는 등 어리석거나 위험한 일을 하는 것을 방지하고 싶습니다 /etc/passwd. 나는 생성된 프로세스가 STDIN/STDOUT 상호 작용을 수행하는 데 사용하고 있습니다.

어떻게 해야 하나요? 지금까지 내 생각은 다음과 같습니다.

  • 내 자신의 "기대 라이트"를 작성합니다. 실행 가능한 것처럼 들리지만 어리석고 시간이 많이 걸립니다.
  • expect작업 파일을 정리합니다 . 복잡하고 오류가 발생하기 쉬운 것 같습니다.
  • 나만의 보안 언어를 개발하고 이를 expect.
  • 작업 흐름을 제한하려면 할당량과 권한을 사용하세요. process많은 CPU 시간을 사용하고 tmp 파일을 생성할 것으로 예상되므로 이는 실제로 옵션이 아닙니다 (해당 파일을 정리할 것이라고 믿습니다).
  • 사용자에게 대화형 액세스를 제공합니다 process. 작업이 대기열에서 한동안 기다려야 할 수 있으므로 이는 옵션이 아닙니다.

expect스크립트를 제한하는 구성 매개변수나 사용할 수 있는 유사한 도구와 같은 분명한 것이 누락되었습니까 ?

답변1

TCL 보안 변환기 는 expect. 코드는 다음과 같습니다 .unsafe.expsafe.expunsafe.expunsafe.exp

#!/usr/bin/expect
spawn whoami
expect {
    "user" { send_user "safe success\n" }
    "root" { send_user "unsafe success\n" }
}

실행 결과 unsafe.exproot

# expect unsafe.exp
spawn whoami
root
unsafe success

이제 사용자는 safe.exp.com 및 .com과 같은 위험한 명령을 사용하지 못하도록 차단 되는 spawn동시에 . 코드는 다음과 같습니다.sendexpect

#!/usr/bin/expect

# create a safe interpreter
interp create -safe untrusted

# provide it with essetial expect functions
interp alias untrusted send_user {} send_user
interp alias untrusted send {} send
interp alias untrusted expect {} expect
interp alias untrusted interact {} interact

# censor the "spawn" function
# not providing it would be just as safe, but scripts using it would fail
proc safe_spawn {args} {
    puts "censored spawn"
}
interp alias untrusted spawn {} safe_spawn

# create a safe process to interact with
spawn sudo -u user whoami

# run unsafe.exp
untrusted invokehidden source unsafe.exp

루트로 실행하면 다음과 같은 safe.exp결과가 발생합니다.

# expect safe.exp
spawn sudo -u user whoami
censored spawn
user
safe success

관련 정보