OpenBSD 켜기 및 사용하기cron
그리고crontab
, 저장할 수 있는지 여부crontab(5)
사용자 수git
동일한 사용자를 위한 저장소?
이와 같은 작업을 수행하는 올바른 방법은 무엇입니까?
(올바른 방향으로 대답하기 위해 바이너리를 다시 컴파일하고 좋은 보안 패러다임을 위반할 필요는 없지만 시스템의 특정 권한을 변경하는 데 반대하지는 않습니다.)
답변1
모든 사용자의 crontab은 디렉토리에 저장됩니다. 사용자는 디렉토리에 직접 액세스할 수 없으며 권한 있는 명령을 사용해야 합니다 crontab
.
버전 관리에 실제 crontab 파일을 저장하는 대신커밋 훅crontab
최신 버전을 푸시하려면 실행하세요 .
crontab "$HOSTNAME.crontab"
가장 간단한 후크는 후크입니다 post-commit
. git rev-parse --abbrev-ref HEAD
현재 분기 찾기를 실행 하고 git show --format=format: --name-status HEAD
.
#!/bin/sh
commit=$(git rev-parse HEAD)
branch=$(git rev-parse --name-status "$commit")
git show --format=format: --name-status "$commit" |
while read -r status filename; do
if [ "$branch" = "master" ] &&
[ "$status" = "A" -o "$status" = "M" ] &&
[ "$filename" = "crontabs/$HOSTNAME.crontab" ]; then
crontab "$filename"
fi
done
이는 병합이나 리베이스를 처리하지 않으며 crontab
실패할 경우 기록에 아무 것도 등록하지 않습니다. 여기에는 약간의 패러다임 충돌이 있습니다. git에는 기본적으로 여러 개의 분기가 있지만 특정 시간에 특정 시스템에서는 하나의 crontab만 있기 때문입니다. 견고성을 높이기 위해 라이브 crontab 전용 브랜치를 갖고 작업 브랜치의 crontab 파일이 변경되면 해당 브랜치에 병합하는 것을 선호할 수 있습니다.
답변2
단일 디렉터리에서 파일을 cron
찾는 것은 crontab
사용자별 git 저장소에 적합하지 않기 때문에 복잡합니다. 나는 /usr/bin/crontab
그것을 가장하는 것 외에도 crontab(1)
사용자가 누구인지 알아내고, git에 저장된 cron 데이터를 검색하거나 생성하고, 변경 사항을 커밋한 다음, cron(8)
원본 crontab(1)
(setgid 비트로 인해)을 호출하는 코드로 대체 할 수 있을 것이라고 생각합니다 . 자체적으로 설정되어야 합니다(위험 위험 안전 경고!). 업그레이드 프로세스 중에 업데이트를 설치한 다음 git 지원 래퍼를 설치하기 위해 옆으로 옮겨야 하기 때문에 시스템 업데이트도 복잡합니다 /usr/bin/crontab
(관련 패치도 마찬가지 crontab
).
원본 버전이 어디에 있는지 아는 사용자는 crontab(1)
git 항목을 우회할 수 있습니다. 이를 방지하려면 구현을 setgid 로 해야 합니다. crontab
이렇게 하면 사용자의 crontab 파일 보안 문제를 임의로 덮어쓸 수 있습니다. 즉, 좋은 방법입니다. root
코드에 보안 문제가 있는 경우 전체 시스템이 손상될 수 있도록 허용합니다(공격자가 crontab 파일에 쓰면 승리합니다!).
또한 상황을 복잡하게 만드는 것은 사용자가 자신의 크론별 git 저장소가 어디에 있는지 파악한 다음 문제를 일으키는 경우입니다. 문제가 발생하면 해당 저장소를 다른 사용자가 소유해야 하며 맞춤 crontab(5)
클라이언트는 누군가와 협력해야 합니다. 이러한 저장소에 대한 권한이 있는 데몬(예: sshd
privsep의 수행 방식)
( rcs
시간에 따른 변경 사항만 추적해야 하고 그보다 적은 문자열이 제공되는 경우에는 충분할 수 있습니다 git
.)