저는 Python 프로그래밍 입문 과정의 조교로 일하고 있으며(모든 작업은 터미널에서 수행됨) 프로젝트 제출 스크립트를 작성하고 있습니다. 이상적으로는 다음과 같은 디렉토리 설정을 원합니다.
submissions/
user1/
project1/
...
user2/
project1/
...
...
이상적으로는 모든 사용자가 커밋 디렉터리의 모든 내용을 읽고 쓸 수 있도록 하고 모든 작업을 올바른 위치에 복사하는 커밋 스크립트를 제공할 것입니다.
현재 제출 부분을 수행하고 이를 사용할 때 작동하는 작은 Perl 스크립트가 있지만 학생들이 스크립트를 실행할 때 오류가 발생하지 않도록 권한(또는 스크립트)을 어떻게 설정합니까 permission denied
(제출 디렉토리에 대한 쓰기 권한이 필요함) 하지만 쓰기 권한도 없나요?
답변1
완전성을 위해 이것이 가장 간단한 솔루션입니다. 나는 버전 관리 시스템이 왜 부적절한지에 대한 나의 관점을 따릅니다.
나는 제출된 실행 파일에서 setuid 비트(chmod 4755)를 활성화하여 학생들이 이를 실행할 때 프로그램이 내 것과 똑같이 실행되도록 했습니다. 모든 파일을 복사하면 소유권이 나에게 이전되며 학생들이 전체 디렉토리에 접근할 수 없도록 할 수 있습니다. 여기에는 Perl에 의해 추가된 setuid 보안의 일부 장애물(오염 입력 없음, 오염 PATH 없음)을 극복하는 것이 포함되었지만 결국에는 잘 작동했습니다. 최종 스크립트의 길이는 약 20줄이었습니다.
버전 관리 시스템이 허용되지 않는 이유는 이것이 프로그래밍의 첫 번째 과정이기 때문입니다. 학생들은 터미널을 사용해 본 적이 없으며 SSH를 통해 서버에 연결하고 파일을 주고받는다는 생각에 매우 혼란스러워했습니다. 버전 관리 시스템의 세부 사항은 상위 수준의 수업에 적합합니다(특히 학생들이 터미널 철자 오류에 취약한 경우!). 오늘 이 코스 중 실제로 버전 제어 시스템에 대한 학습이 필요한 코스가 얼마나 많은지 알면 놀랄 것입니다(저는 학부 때 4개의 코스를 수강했습니다). 버전 관리 시스템을 설정할 수 없는 덜 중요한 이유는 서버에 대한 수퍼유저 권한을 가질 수 없고 버전 관리 시스템을 파악할 수 없다는 이유만으로 교수에게 버전 관리 시스템 설정을 요청하지 않기 때문입니다. 멍청한 setuid 비트.
이 과정에서 제가 원했던 것은 비공개 위치에 간단한 1단계 제출뿐이었습니다. 문제는 내 솔루션의 구조가 아니라 내 구현과 Unix 권한에 대한 지식 부족(setuid 비트를 알지 못함)에 있습니다. 따라서 Sean C.의 의견은 힌트였지만 처음에는 스크립트를 루트로 실행하려는 것처럼 보였고 그것이 내 유닉스 천진함으로부터 세상을 보호하기를 원하지 않았기 때문에 나는 그것을 처음에는 깨닫지 못했습니다.
이는 실제 작업 스크립트와 해당 권한입니다. 귀하가 발견한 보안 취약점을 표시해 주십시오.
-rwsr-xr-x 1 260s12ta 260s12ta 600 2012-01-16 23:19 submit
#!/usr/bin/perl
use File::Copy;
$ENV{"PATH"} = "/usr/bin"; # appease the perl-suid security for shell calls
my $username = getlogin() or die "Couldn't access user login: $!\n";
my $dir = "/home/260s12ta/labs/$username/";
foreach (@ARGV) {
if ($_ =~ /([\w-]+\.tar\.gz)/) { # untaint the given filename
$filename = $1;
} else {
die "\nInvalid submission: $_ is not a .tar.gz file.\n";
}
print "Submitting $filename... ";
copy($filename, $dir) or print "Submission failed: $!\n";
chmod(0600, "$dir/$filename") or print "Submission failed: $!\n";
print "OK!\n";
}
답변2
댓글 중 하나에 대한 후속 조치(아직 댓글을 달 만큼 충분한 능력이 없습니다): 모든 사람이 자신의 작업을 완료하기 위해 알려진 호스트에 대한 셸 액세스 권한을 갖고 있는 것 같습니다. 이것은 일을 간단하게 만듭니다. 당신이 할 수 있고 해야 할 일은 다음과 같습니다:
- 각 학생을 위해 git 서버(이 유형의 환경에서는 gitolite가 바람직함)와 별도의 저장소를 설정해야 합니다. 학생 홈 디렉토리가 설정되어 있다고 가정하면 각 학생 계정에 대해 ssh-keygen을 실행하고 공개 키를 gitolite 관리 구성에 복사할 수 있습니다.(편집(설명): gitolite를 설치하려면 루트 액세스가 필요하지 않습니다. 물론 학생 공개/개인 키를 생성하려면 해당 계정에 액세스해야 하지만 이는 필요할 경우 스스로 실행할 수 있는 하나의 명령(ssh-keygen)일 뿐입니다. )
- 모든 학생오직다음 권한이 있습니다.그들의저장소이지만 모두 읽고 쓸 수 있습니다.
- 과정 시작 시 초기 템플릿과 지침을 사용하여 저장소를 복제한 후 새 과제와 제출물을 가져오거나 푸시하기만 하면 됩니다.
- 각 프로젝트(작업)는 제안한 대로 별도의 디렉터리에 있을 수 있습니다. 디렉터리를 직접 만들고 변경 사항을 커밋/푸시할 수 있으며, 프로젝트를 시작할 때 변경 사항을 간단히 끌어올 수 있습니다. (예, 각 학생에 대해 이 작업을 수행해야 하지만 쉽게 스크립트로 작성할 수 있습니다.) 이렇게 하면 자동 채점을 지원하기 위해 프로젝트 디렉토리의 이름이 모두 올바르게 지정되었음을 알 수 있습니다.
- 보너스: 마감일 전날 밤에 누가 프로젝트를 시작했는지, 누가 일찍 시작하여 진행하면서 개선했는지 확인할 수 있습니다. 안정적인 헌신에 대한 보너스 포인트, "완료된" 프로젝트에 대한 개별 커밋에 대한 마이너스 포인트. 또한 (선택적으로) 사람들이 팀으로 작업하도록 할 수도 있습니다.진짜누가 모든 작업을 수행했는지 확인하세요. (모든 사람은 자신만의 커밋 기록을 가지고 있습니다.) gitolite에서 이러한 방식으로 권한을 구성하는 것은 간단합니다.
간단히 말해서, 학생들은 배울 것이 너무 많고 가르칠 시간이 거의 없습니다. 지난 20년 동안 전문 개발자로서 실제로 사용 방법을 아는 신입 사원이 대학을 졸업한 경우는 거의 본 적이 없습니다.어느버전 제어 유형입니다. 그들은 프로그래밍 언어 x, y, z(및 Java)에 대한 지식이 부족하고 소프트웨어 개발에 대해 전혀 모릅니다. 하지만 학생들을 비난할 수는 없겠죠? (에헴…) 이것은 가르치는 순간입니다.
답변3
당신은 사용할 수 있어야합니다끈끈한 비트학생들이 공유 디렉터리에 있는 자신의 파일만 덮어쓰도록 허용합니다.
편집: 학생들이 다른 학생의 작업을 읽을 수 있기 때문에 문제가 해결되지 않습니다.