У нас принято считать безопасным вот такую конфигурацию (на примере нескольких раннеров на одной машине):
concurrent = 10
check_interval = 0
[[runners]]
name = "docker-ansible"
url = "<gitlab_url>"
token = "<project_token>"
executor = "docker"
[runners.custom_build_dir]
[runners.docker]
image = "<image>"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
shm_size = 0
volumes = ["/cache"]
pull_policy = "if-not-present"
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
tag_list = ["<tag>"]
run_untagged = false
access_level = "not_protected"
locked = false
[[runners]]
name = "docker-ci"
url = "<gitlab_url>"
token = "<project_token>"
executor = "docker"
[runners.custom_build_dir]
[runners.docker]
image = "<image>"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
shm_size = 0
volumes = ["/cache"]
pull_policy = "if-not-present"
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
tag_list = ["<tag>"]
run_untagged = false
access_level = "not_protected"
locked = false
Основное это отсутствие привилегированного режима и сервисов. Не монтируем
docker.sock и не используем dind (он требует привилегированного режима). Также интернета на раннере нет, только внутренняя сеть. Следовательно мы используем прокси для пакетного менеджера и docker образов.#gitlab