
Anteater - CI/CD 게이트 체크 프레임워크
Anteater는 지정된 문자열, 파일명, 바이너리, 사용 중단된 함수, 스테이징 환경 코드/자격 증명 등이 병합되는 것을 방지하기 위한 개방형 프레임워크입니다. 정규 표현식 구문으로 지정할 수 있는 모든 것을 anteater가 찾아낼 수 있습니다.
anteater에 병합되길 원하지 않는 것을 정확히 알려주면, anteater가 나머지를 처리합니다.
anteater가 무언가를 발견하면 0이 아닌 코드로 종료되어 CI 도구의 빌드를 실패시키며, 이는 풀 리퀘스트 병합을 방지하는 역할을 합니다. 잘못된 양성(false positive)은 동일한 RegExp 프레임워크를 사용하여 잘못된 일치를 취소함으로써 쉽게 무효화할 수 있습니다.
전체 프로젝트도 재귀적 디렉터리 탐색을 사용하여 스캔할 수 있습니다.
몇 가지 간단한 단계만으로 Travis CI, CircleCI, Gitlab CI/CD, Jenkins와 같은 도구를 사용하는 CI/CD 워크플로우에 쉽게 통합할 수 있습니다.
현재 Linux Foundation의 프로젝트인 'OPNFV'에서 게이트의 자동화된 보안 검사 수단으로 사용되고 있으며, 아래 예제에서 볼 수 있듯이 다른 시나리오에서도 사용할 수 있습니다.
Anteater는 Virus Total API와의 통합도 제공하므로, anteater가 찾아낸 바이너리, 공인 IP 주소 또는 URL은 Virus Total API로 전송되어 보고서가 반환됩니다. 어떤 객체가 악성으로 보고되면 CI 빌드 작업이 실패합니다.
무엇으로 시작해야 할지 모르는 사람들을 위해 예시 콘텐츠가 제공되며, 유용하다고 생각되는 Anteater 필터 문자열을 공유하는 것을 권장하고 환영합니다.
Anteater는 다양한 용도가 있으며, 자신의 특정 요구 사항에 맞게 쉽게 조정할 수 있습니다.
첫째, 앞서 언급했듯이 잠재적인 보안 영향이나 위험이 있는 문자열과 파일을 차단하도록 설정할 수 있습니다. 여기에는 개인 키, 셸 히스토리, AWS 자격 증명 등이 포함될 수 있습니다.
특히 스테이징/개발 환경에서 사용되는 요소가 프로덕션 환경으로 들어가지 않도록 하는 데 유용합니다.
몇 가지 예를 살펴보겠습니다:
apprun:
regex: app\.run\s*\(.*debug.*=.*True.*\)
desc: "Running flask in debug mode could potentially leak sensitive data"
위의 내용은 Flask 서버가 디버그 모드로 실행되도록 설정된 코드(app.run(host='0.0.0.0' port=80 debug=true))와 일치하며, 이는 개발자 환경에서 흔히 발생하여 실수로 프로덕션에 배포될 수 있습니다.
Rails 앱의 경우 다음과 같을 수 있습니다:
regex: \<%=.*debug.*%>
더 간단하게는, 대부분의 로깅 프레임워크에서 다음을 찾습니다:
regex: log\.debug
개발자가 실수로 개인 키를 추가하는 것을 막아야 합니까?
private_key:
regex: -----BEGIN\sRSA\sPRIVATE\sKEY----
desc: "This looks like it could be a private key"
프로덕션에 유출되면 실직 위험이 있는 자격 증명 파일은 어떻습니까? Anteater는 파일 이름도 처리합니다.
예를 들어:
jenkins\.plugins\.publish_over_ssh\.BapSshPublisherPlugin\.xml
또는 심지어..
- \.pypirc
- \.gem\/credentials
- aws_access_key_id
- aws_secret_access_key
- LocalSettings\.php
앱에 자체 사용자 지정 비밀/설정 파일이 있는 경우, 자신의 정규 표현식을 추가하는 것은 매우 쉽습니다. 모든 것이 YAML 형식으로 설정되므로 anteater 코드를 변경할 필요가 없습니다.
또 다른 용도는 프로젝트에서 이전 함수를 사용 중단했지만, 개발자가 여전히 이전 함수 이름을 사용하여 풀 리퀘스트를 보낼 수 있는 경우입니다:
depreciated_function:``
regex: depreciated_function\(.*\)
desc: This function was depreciated in release X, use Y function.
또는 사람들이 프레임워크의 1.x 버전을 사용하지 못하도록 하는 경우:
<script.src.*="https:\/\/ajax\.googleapis\.com\/ajax\/libs\/angularjs\/1.*<\/script>
쉽습니다. 일치를 중지하는 RegExp를 설정하면 됩니다. 일종의 RegExp'ception과 같습니다.
MD5 사용을 중지하고 싶다고 가정해 보겠습니다:
md245:
regex: md[245]
desc: "Insecure hashing algorithm"
그러면 이것이 다음과 같은 것과 잘못 일치할 수 있습니다:
mystring = int(amd500) * 4
특정 무시 RegEx를 설정하여 일치시킨 후 무시 항목에 의해 일치가 취소되도록 합니다.
mystring.=.int\(amd500\).*
그러나 다른 MD5 인스턴스는 계속 플래그가 지정됩니다.
anteater에서 --binaries 인수를 전달하면, 발견된 모든 바이너리가 해당 풀 리퀘스트의 빌드 실패를 유발합니다. anteater의 YAML 무시 파일 내에 sha256 체크섬이 설정될 때까지 빌드가 통과되도록 허용되지 않습니다.
이는 사람들이 컴파일된 객체, 이미지, PDF 등 알 수 없는 출처가 있거나 기존 바이너리 파일이 변조된 것을 체크인하는 것을 차단할 수 있음을 의미합니다.
예:
$ anteater --binaries --project myproj --patchset /tmp/patch
Non Whitelisted Binary file: /folder/to/repo/images/pal.png
Please submit patch with this hash: 3aeae9c71e82942e2f34341e9185b14b7cca9142d53f8724bb8e9531a73de8b2
해시를 입력해 봅시다:
binaries:
images/pal.png:
- 3aeae9c71e82942e2f34341e9185b14b7cca9142d53f8724bb8e9531a73de8b2
작업을 다시 실행합니다:
$ anteater --binaries --project myproj --patchset /tmp/patch
Found matching file hash for: /folder/to/repo/images/pal.png
이렇게 하면 암호화 서명/체크섬 실패를 통해 바이너리가 변조되지 않았음을 확인할 수 있습니다.
sha256 체크섬이 없는 바이너리는 Virus Total API로 전송되어 스캔됩니다.
다음 플래그(단독 또는 조합) --ips, -urls, --binaries가 사용되면, anteater는 Virus Total API에 조회를 수행합니다.
IP 주소의 경우, DNS 기록을 확인하여 이전 또는 현재 악성으로 표시되거나 맬웨어를 포함하는 것으로 알려진 블랙리스트 도메인과의 연결이 있는지 확인합니다.
URL의 경우, 이전 또는 현재 악성으로 표시되거나 맬웨어를 포함하는 것으로 알려진 블랙리스트 도메인과의 연결이 있는지 확인합니다.
앞서 언급했듯이, 바이너리는 Virus Total로 전송되어 깨끗한지/감염되었는지 확인됩니다.
더 자세한 정보와 심층 문서는 readthedocs를 방문해 주십시오.
마지막으로, anteater를 사용하신다면 알려주시기 바랍니다 (트위터: @decodebytes). 풀 리퀘스트와 이슈는 언제나 환영합니다!
기여는 환영합니다.
새로운 브랜치에서 풀 리퀘스트를 만들어 주시고, master 브랜치가 아닌 다른 브랜치에서 작업해 주십시오.
git checkout -b mypatch
git push origin mypatch
단위 테스트와 PEP8 검사는 tox에 포함되어 있으므로, 코드를 푸시하기 전에 tox 명령어를 실행하십시오.
패치가 이슈를 수정하는 경우, 커밋 메시지에 이슈 URL을 포함해 주십시오.