mirror of
https://github.com/juanfont/headscale.git
synced 2026-01-11 20:00:28 +01:00
Support for SSH check mode in ACLs #679
Open
opened 2025-12-29 02:21:59 +01:00 by adam
·
10 comments
No Branch/Tag Specified
main
update_flake_lock_action
gh-pages
kradalby/release-v0.27.2
dependabot/go_modules/golang.org/x/crypto-0.45.0
dependabot/go_modules/github.com/opencontainers/runc-1.3.3
copilot/investigate-headscale-issue-2788
copilot/investigate-visibility-issue-2788
copilot/investigate-issue-2833
copilot/debug-issue-2846
copilot/fix-issue-2847
dependabot/go_modules/github.com/go-viper/mapstructure/v2-2.4.0
dependabot/go_modules/github.com/docker/docker-28.3.3incompatible
kradalby/cli-experiement3
doc/0.26.1
doc/0.25.1
doc/0.25.0
doc/0.24.3
doc/0.24.2
doc/0.24.1
doc/0.24.0
kradalby/build-docker-on-pr
topic/docu-versioning
topic/docker-kos
juanfont/fix-crash-node-id
juanfont/better-disclaimer
update-contributors
topic/prettier
revert-1893-add-test-stage-to-docs
add-test-stage-to-docs
remove-node-check-interval
fix-empty-prefix
fix-ephemeral-reusable
bug_report-debuginfo
autogroups
logs-to-stderr
revert-1414-topic/fix_unix_socket
rename-machine-node
port-embedded-derp-tests-v2
port-derp-tests
duplicate-word-linter
update-tailscale-1.36
warn-against-apache
ko-fi-link
more-acl-tests
fix-typo-standalone
parallel-nolint
tparallel-fix
rerouting
ssh-changelog-docs
oidc-cleanup
web-auth-flow-tests
kradalby-gh-runner
fix-proto-lint
remove-funding-links
go-1.19
enable-1.30-in-tests
0.16.x
cosmetic-changes-integration
tmp-fix-integration-docker
fix-integration-docker
configurable-update-interval
show-nodes-online
hs2021
acl-syntax-fixes
ts2021-implementation
fix-spurious-updates
unstable-integration-tests
mandatory-stun
embedded-derp
prtemplate-fix
v0.28.0-beta.1
v0.27.2-rc.1
v0.27.1
v0.27.0
v0.27.0-beta.2
v0.27.0-beta.1
v0.26.1
v0.26.0
v0.26.0-beta.2
v0.26.0-beta.1
v0.25.1
v0.25.0
v0.25.0-beta.2
v0.24.3
v0.25.0-beta.1
v0.24.2
v0.24.1
v0.24.0
v0.24.0-beta.2
v0.24.0-beta.1
v0.23.0
v0.23.0-rc.1
v0.23.0-beta.5
v0.23.0-beta.4
v0.23.0-beta3
v0.23.0-beta2
v0.23.0-beta1
v0.23.0-alpha12
v0.23.0-alpha11
v0.23.0-alpha10
v0.23.0-alpha9
v0.23.0-alpha8
v0.23.0-alpha7
v0.23.0-alpha6
v0.23.0-alpha5
v0.23.0-alpha4
v0.23.0-alpha4-docker-ko-test9
v0.23.0-alpha4-docker-ko-test8
v0.23.0-alpha4-docker-ko-test7
v0.23.0-alpha4-docker-ko-test6
v0.23.0-alpha4-docker-ko-test5
v0.23.0-alpha-docker-release-test-debug2
v0.23.0-alpha-docker-release-test-debug
v0.23.0-alpha4-docker-ko-test4
v0.23.0-alpha4-docker-ko-test3
v0.23.0-alpha4-docker-ko-test2
v0.23.0-alpha4-docker-ko-test
v0.23.0-alpha3
v0.23.0-alpha2
v0.23.0-alpha1
v0.22.3
v0.22.2
v0.23.0-alpha-docker-release-test
v0.22.1
v0.22.0
v0.22.0-alpha3
v0.22.0-alpha2
v0.22.0-alpha1
v0.22.0-nfpmtest
v0.21.0
v0.20.0
v0.19.0
v0.19.0-beta2
v0.19.0-beta1
v0.18.0
v0.18.0-beta4
v0.18.0-beta3
v0.18.0-beta2
v0.18.0-beta1
v0.17.1
v0.17.0
v0.17.0-beta5
v0.17.0-beta4
v0.17.0-beta3
v0.17.0-beta2
v0.17.0-beta1
v0.17.0-alpha4
v0.17.0-alpha3
v0.17.0-alpha2
v0.17.0-alpha1
v0.16.4
v0.16.3
v0.16.2
v0.16.1
v0.16.0
v0.16.0-beta7
v0.16.0-beta6
v0.16.0-beta5
v0.16.0-beta4
v0.16.0-beta3
v0.16.0-beta2
v0.16.0-beta1
v0.15.0
v0.15.0-beta6
v0.15.0-beta5
v0.15.0-beta4
v0.15.0-beta3
v0.15.0-beta2
v0.15.0-beta1
v0.14.0
v0.14.0-beta2
v0.14.0-beta1
v0.13.0
v0.13.0-beta3
v0.13.0-beta2
v0.13.0-beta1
upstream/v0.12.4
v0.12.4
v0.12.3
v0.12.2
v0.12.2-beta1
v0.12.1
v0.12.0-beta2
v0.12.0-beta1
v0.11.0
v0.10.8
v0.10.7
v0.10.6
v0.10.5
v0.10.4
v0.10.3
v0.10.2
v0.10.1
v0.10.0
v0.9.3
v0.9.2
v0.9.1
v0.9.0
v0.8.1
v0.8.0
v0.7.1
v0.7.0
v0.6.1
v0.6.0
v0.5.2
v0.5.1
v0.5.0
v0.4.0
v0.3.6
v0.3.5
v0.3.4
v0.3.3
v0.3.2
v0.3.1
v0.3.0
v0.2.2
v0.2.1
v0.2.0
v0.1.1
v0.1.0
Labels
Clear labels
CLI
DERP
DNS
Nix
OIDC
SSH
bug
database
documentation
duplicate
enhancement
faq
good first issue
grants
help wanted
might-come
needs design doc
needs investigation
no-stale-bot
out of scope
performance
policy 📝
pull-request
question
regression
routes
stale
tags
tailscale-feature-gap
well described ❤️
wontfix
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/headscale#679
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @almereyda on GitHub (Mar 27, 2024).
Why
Tailscale upstream supports SSH check mode.
We would like to use it with Headscale, too.
Description
When defining an Tailscale SSH ACL policy with the
actionset tocheck, an additional authentication against the OIDC endpoint is required, which grants access within an optionalcheckPeriod, defaulting to 12 hours and allowing to be set toalways.References
This is related to, but not identical to:
checkmode@github-actions[bot] commented on GitHub (Aug 7, 2024):
This issue is stale because it has been open for 90 days with no activity.
@almereyda commented on GitHub (Aug 7, 2024):
No stale activity.
@dparv commented on GitHub (Aug 22, 2024):
+1
@lordwelch commented on GitHub (Mar 16, 2025):
I tested check mode and it generally works, however when checkPeriod is set to "always" the node will go offline shortly after and I'll have to either turn off check mode or set the checkPeriod to an actual duration. tested on v0.25.1
@lordwelch commented on GitHub (Mar 16, 2025):
Also it appears that check mode is implemented differently in headscale currently. When testing with tailscale proper a checkPeriod of 1 minute triggers a re-authentication before allowing me in and for the next minute new connections do not require a new authentication. In headscale it doesn't make me re-authenticate but will kill the session after 1 minute regardless of what I do. tested on v0.25.1
@Codelica commented on GitHub (May 13, 2025):
I took a look at this also, as we'd gladly pay a bounty for SSH check mode support. (Sadly we have no Go devs).
Looking at the policy code for both V1 and V2, they both seem to use the
checkPeriodto setSessionDurationin the response:V1:
43943aeee9/hscontrol/policy/v1/acls.go (L373)V2:
43943aeee9/hscontrol/policy/v2/filter.go (L92)Which according to Tailscale code seems to be "how long the session can stay open before being forcefully terminated":
fccba5a2f1/tailcfg/tailcfg.go (L2692)So it seems this was implemented incorrectly.
My guess is that a conditional combination of
MessageandHoldAndDelegateis what would be used to block/wait on verification if the user hasn't authenticated within the check period:fccba5a2f1/tailcfg/tailcfg.go (L2700)I know the focus is currently on the policy v2 re-write beta, but perhaps it could be reviewed as a bug? :) If not, maybe it's a candidate for the next version?
Thanks for reading...
@kradalby commented on GitHub (May 14, 2025):
@Codelica I noticed as well that there was something funky with the implementation, but I tried to separate the 0.26 release to be the rewrite so the feature creep it. I'm going to release it now, and then we start a new cycle which I will add this as a bug that needs to be fixed.
As people know, I am paid, so not needed, but donating to Juan/The project is always welcome to cover costs for anything from domain and our dream about putting up own build servers.
@Codelica commented on GitHub (May 14, 2025):
Excellent! Count us in for testing. 👍 Will get migrated to 0.26.
@kradalby commented on GitHub (May 19, 2025):
I spent some exploratory time on this last Friday. It is quite a lot more involved than anticipated, but not impossible. I think it should be possible to implement in this release. I am not sure how it will be to test it yet, which is a concern for ensuring it will break over time.
@Codelica commented on GitHub (May 19, 2025):
I can definitely appreciate that (testing difficulty) with time, oidc and ssh involved. It looks like
checkPeriodhas a minimum of 1 minute and maximum of 168 hours (1 week), along with an "always" option to always check. But even a test scenario using a short duration, delays, etc could get complicated depending how far it's taken (re-auth declines/failures, etc).Personally I think it's a key feature for Tailscale SSH access though (especially for connections left up 24x7), and would love to see it working. I can promise once it's functional we'll definitely be doing a "real world" test before deploying any new version to production. If you'd consider adding a final RC release (or somehow indicating a final beta), we could definitely promise to test those before new version releases. I realize that's not as good as an automated test that can be continually run, but hopefully better than nothing. If the logic is isolated and written defensively when possible (fail securely, etc), maybe that and hand testing is enough to start? :)