Skip to content

[2/3] Add permissions command#479

Merged
EthanHeilman merged 7 commits into
openpubkey:mainfrom
fdcastel:add-permissions-command
Mar 23, 2026
Merged

[2/3] Add permissions command#479
EthanHeilman merged 7 commits into
openpubkey:mainfrom
fdcastel:add-permissions-command

Conversation

@fdcastel
Copy link
Copy Markdown
Contributor

Based on #478

Adds a new opkssh permissions command for checking and fixing file permissions/ACLs, and refactors the audit command infrastructure to support cross-platform permission validation.

This is the second of three PRs splitting the work from #389 (Windows SSH server support).

Changes

New permissions command

Adds opkssh permissions with three subcommands:

  • permissions check — Verifies that all opkssh files have correct permissions/ACLs. Reports problems without modifying anything.
  • permissions fix — Repairs permissions/ACLs on opkssh files (requires admin/root).
  • permissions install — Non-interactive permission setup for use by installers. Sets up correct ownership, groups, and permissions for a fresh installation.

Permission infrastructure (policy/files/)

  • PermInfo struct — Centralized definition of required file permissions (mode, owner, group, ACL entries) for each opkssh file type (system policy, home policy, providers, config, binary, log, plugin dir). Platform-specific implementations in perminfo_unix.go and perminfo_windows.go.
  • ACL verification abstraction (acl.go, acl_unix.go, acl_windows.go) — Cross-platform interface for verifying file access control lists. Unix implementation checks POSIX modes; Windows implementation checks NTFS DACLs.
  • File permission operations (fileperms_ops.go, fileperms_ops_windows.go) — Cross-platform file ownership and permission manipulation (chown, chmod, ACL modification).
  • permschecker_common.go — Shared permission checker code extracted from the original permschecker.go.
  • permschecker_windows.go — Windows-specific permission checker using ACL APIs.
  • Windows SID utilities (sid_windows.go) — Helper for resolving Windows Security Identifiers.

Audit command refactors

  • Platform-independent paths: Replaced hardcoded /etc/opk/ paths with policy.GetSystemConfigBasePath() and policy.SystemDefaultProvidersPath/SystemDefaultPolicyPath.
  • Shared permission checking: Extracted CheckFilePermissions() function used by both audit and permissions commands.
  • Platform-specific user enumeration: Moved /etc/passwd parsing to audit_enum_unix.go; added audit_enum_windows.go for Windows user profile enumeration via registry.
  • Windows audit support: Added audit_windows_profiles.go for enumerating Windows user profiles, and audit_windows_test.go for Windows-specific audit tests.
  • Updated audit flags: Default paths now use platform-aware constants; --skip-user-policy defaults to true on Windows.

Policy refactors

  • Platform-specific paths (paths_unix.go, paths_windows.go): GetSystemConfigBasePath() returns /etc/opk on Unix, %ProgramData%\opk on Windows.
  • policyloader.go: Uses filepath.Join + GetSystemConfigBasePath() instead of hardcoded paths.
  • multipolicyloader.go: Moved ReadWithSudoScript to platform-specific files (multipolicyloader_unix.go for sudo, multipolicyloader_windows.go returning unsupported error).
  • plugins.go: Export RequiredPolicyDirPerms() for use by the permissions command.

Other changes

  • commands/elevate_unix.go / elevate_windows.go: Platform-specific elevation detection (root check on Unix, admin check on Windows).
  • commands/verify_test_unix.go: Moved Linux-specific verify tests to build-tagged file.
  • commands/add_test.go: Removed test case that relied on platform-specific permission behavior.
  • policy/plugins/plugins_test.go: Removed permission-specific test cases that don't work cross-platform (file mode checks on Windows behave differently).
  • docs/audit.md: Documents the relationship between audit and permissions commands.

Testing

  • All existing tests pass on both Linux and Windows.
  • New tests: audit_permissions_test.go, audit_windows_test.go, permissions_test.go, permissions_fix_nonwindows_test.go, permissions_fix_windows_test.go, permissions_install_test.go, permissions_mocks_test.go.

Related

Comment thread .github/workflows/release-fork.yml Fixed
@fdcastel fdcastel changed the title Add permissions command [2/3] Add permissions command Feb 23, 2026
@fdcastel fdcastel force-pushed the add-permissions-command branch from a850074 to ca09746 Compare February 28, 2026 16:55
@fdcastel
Copy link
Copy Markdown
Contributor Author

Rebased onto the latest main.

@fdcastel fdcastel force-pushed the add-permissions-command branch 2 times, most recently from a6edc5a to 7726732 Compare March 2, 2026 22:37
@fdcastel
Copy link
Copy Markdown
Contributor Author

fdcastel commented Mar 2, 2026

Rebased onto the latest main.

@EthanHeilman: this one’s up next in the queue 😉
@Basti-Fantasti: if you could, we’d really appreciate your thoughts as well.

I’m happy to take care of any changes or fixes you’d like.

Comment thread commands/add_test.go
@EthanHeilman
Copy link
Copy Markdown
Member

@fdcastel Looking forward to reviewing this. I won't have time until next week, 55 files is a lot of files to review =)

@fdcastel
Copy link
Copy Markdown
Contributor Author

fdcastel commented Mar 4, 2026

I completely understand. Yes, there are quite a few changes related to infrastructure updates and other refactors that I picked up along the way. I tried to split them between this PR and the next one.

If you have any suggestions, I could look into breaking this down into smaller PRs.

I’ll try to explore an approach along those lines, if time permits.

Copy link
Copy Markdown
Member

@EthanHeilman EthanHeilman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a complete review, but all the time I had today

Comment thread main.go
Comment thread policy/files/perminfo_unix.go Outdated
Comment thread policy/files/acl_windows_unit_test.go
Comment thread commands/audit_enum_unix.go Outdated
Comment thread commands/audit_enum_windows.go Outdated
Comment thread commands/audit_windows_profiles.go
Comment thread commands/elevate_windows.go
Comment thread commands/permissions.go Outdated
Comment thread commands/permissions.go Outdated
Comment thread commands/permissions.go
- Add new 'opkssh permissions' command with check/fix/install subcommands
  for managing file permissions and ACLs on both Linux and Windows
- Refactor audit command to use shared permission checking infrastructure
- Introduce PermInfo struct for centralized file permission definitions
- Add ACL verification abstraction (Unix file modes + Windows ACLs)
- Extract platform-specific user enumeration for audit command
- Add Windows user profile enumeration for audit
- Move platform-specific test code to build-tagged files
- Refactor policy paths to be platform-independent using
  GetSystemConfigBasePath()
- Split ReadWithSudoScript into platform-specific files
- Add comprehensive tests for permissions command
- Add audit + permissions consistency documentation
- Export RequiredPolicyDirPerms from plugins package
fdcastel added a commit to fdcastel/opkssh that referenced this pull request Mar 9, 2026
- Fix copyright year to 2026 in all new files
- Add full Apache license headers to elevate_unix.go and elevate_windows.go
- Use 0o prefix for octal file permission literals (0o640, 0o750, etc.)
- Refactor permissions.go: use PermissionsCmd struct with Out/ErrOut/In
  fields instead of package-level variables and disconnected functions
- Add --json flag to permissions check and fix subcommands
- Rename etcPasswdRow to userHomeEntry (generic across platforms)
- Add explanatory comments for silently skipped errors in
  audit_windows_profiles.go
- Add unit tests for enumerateUserHomeDirs on both Unix and Windows
- Update all test files to use struct-based PermissionsCmd API
- Fix copyright year to 2026 in all new files
- Add full Apache license headers to elevate_unix.go and elevate_windows.go
- Use 0o prefix for octal file permission literals (0o640, 0o750, etc.)
- Refactor permissions.go: use PermissionsCmd struct with Out/ErrOut/In
  fields instead of package-level variables and disconnected functions
- Add --json flag to permissions check and fix subcommands
- Rename etcPasswdRow to userHomeEntry (generic across platforms)
- Add explanatory comments for silently skipped errors in
  audit_windows_profiles.go
- Add unit tests for enumerateUserHomeDirs on both Unix and Windows
- Update all test files to use struct-based PermissionsCmd API
@fdcastel fdcastel force-pushed the add-permissions-command branch from 1cf0c26 to 77648e4 Compare March 9, 2026 23:16
@fdcastel
Copy link
Copy Markdown
Contributor Author

fdcastel commented Mar 9, 2026

Rebased onto the latest main. Made the following changes based on feedback:

  1. Copyright year — Updated Copyright 2025Copyright 2026 in all 16 new files.

  2. License headers — Added full Apache 2.0 license headers to elevate_unix.go and elevate_windows.go.

  3. Octal notation — Changed all raw octal literals (0640, 0750, 0600) to use the explicit 0o prefix (0o640, 0o750, 0o600) in code and comments across perminfo_unix.go, perminfo_windows.go, permschecker_common.go, perminfo.go, and test files.

  4. Struct-based PermissionsCmd — Refactored permissions.go from package-level variables (DefaultFs, ConfirmPrompt, IsElevatedFunc, RunPermissionsFixWithDepsFn) to a PermissionsCmd struct with Fs, Out, ErrOut, In, Ops, ACLVerifier, IsElevatedFn, and ConfirmPrompt fields — matching the AuditCmd pattern. Updated main.go and all 5 test files accordingly.

  5. --json flag — Added --json/-j flag to both permissions check and permissions fix subcommands, outputting structured JSON via json.Encoder.

  6. Renamed etcPasswdRowuserHomeEntry — Made the struct name platform-generic across audit.go, audit_enum_unix.go, audit_enum_windows.go, audit_windows_profiles.go, and audit_test.go.

  7. Error handling comments — Added inline comments in audit_windows_profiles.go explaining why each continue (stale registry entries, incomplete profiles, orphaned SIDs) is intentionally silent.

  8. New tests — Added audit_enum_unix_test.go and audit_enum_windows_test.go with unit tests for enumerateUserHomeDirs on both platforms.

@EthanHeilman
Copy link
Copy Markdown
Member

Probably too big of an ask, but the permissions issue adds a lot of complex and files, is there anyway to create a mockable files struct that hides and abstracts away all the permission and filesystem details.

@fdcastel
Copy link
Copy Markdown
Contributor Author

Probably too big of an ask, but the permissions issue adds a lot of complex and files, is there anyway to create a mockable files struct that hides and abstracts away all the permission and filesystem details.

I understand. No problem!

I’m a bit tight on schedule right now, but give me a few days and I’ll come back with something.

Also, if you wish/have any suggestions on how to split this PR into smaller sub-PRs, I’m all ears. 😄

Consolidate Fs (afero.Fs), FilePermsOps, PermsChecker, and ACLVerifier
into a single mockable files.FileSystem interface. This hides platform-
specific permission and filesystem details behind one abstraction.

Changes:
- New policy/files/filesystem.go: FileSystem interface with 13 methods
  covering file I/O, permission mutations, permission checking, and ACL
  verification. DefaultFileSystem delegates to existing implementations.
- PermissionsCmd: Replace Fs+Ops+ACLVerifier fields with single
  FileSystem field.
- AuditCmd: Replace filePermsChecker+aclVerifier with FileSystem field
  (Fs kept for backward-compatible file reads).
- CheckFilePermissions: Simplified from 5 params to 3 (FileSystem,
  path, permInfo).
- All test mocks consolidated into one mockFileSystem struct.
Tests using in-memory filesystems need a mock CmdRunner since the
real 'stat' command cannot operate on afero.MemMapFs paths.

- Add FileSystemOption/WithCmdRunner to configure the command runner
  used by the underlying PermsChecker
- Update all test constructors to use WithCmdRunner
- Fix gofmt struct field alignment in AuditCmd
@fdcastel
Copy link
Copy Markdown
Contributor Author

fdcastel commented Mar 12, 2026

@EthanHeilman I've implemented an unified mockable FileSystem interface you suggested.

This is just a first attempt. If you're not happy with it, we can always roll it back and try a different approach.

Do not hesitate to suggest alternative paths -- I’m totally open to them!


Summary of changes

New: policy/files/filesystem.go — A single FileSystem interface that combines:

  • File I/O (Stat, Exists, Open, ReadFile, MkdirAll, CreateFile, WriteFile)
  • Permission mutations (Chmod, Chown, ApplyACE)
  • Permission checking (CheckPerm, VerifyACL)

The NewFileSystem(afero.Fs) constructor wires up the platform-specific FilePermsOps, PermsChecker, and ACLVerifier behind this single interface. A WithCmdRunner functional option allows tests to inject a mock command runner.

Refactored PermissionsCmd — Now has a single FileSystem files.FileSystem field instead of three separate fields (Fs, Ops, ACLVerifier). All methods use p.FileSystem.* uniformly.

Refactored AuditCmd — Added FileSystem files.FileSystem field. Permission checking via CheckFilePermissions now takes a FileSystem instead of separate checker + verifier arguments.

Refactored CheckFilePermissions — Signature simplified from (afero.Fs, files.PermsChecker, files.ACLVerifier, path, permInfo)(files.FileSystem, path, permInfo).

Simplified test mocks — A single mockFileSystem struct implements the interface, replacing the previous mockFilePermsOps + mockACLVerifier pattern. Tests now create mocks with one struct instead of three separate components.

Files changed (12 files)

File Change
policy/files/filesystem.go New — unified interface + default implementation
commands/permissions.go Uses FileSystem instead of Fs/Ops/ACLVerifier
commands/permcheck.go Simplified CheckFilePermissions signature
commands/audit.go Uses FileSystem for permission checks
commands/permissions_mocks_test.go Single mockFileSystem replaces two separate mock types
commands/permissions_fix_nonwindows_test.go Updated to use mockFileSystem
commands/permissions_fix_windows_test.go Updated to use mockFileSystem
commands/permissions_install_test.go Updated to use mockFileSystem
commands/permissions_test.go Uses newTestPermissionsCmd with WithCmdRunner
commands/audit_test.go Uses files.NewFileSystem with WithCmdRunner
commands/audit_permissions_test.go Uses files.NewFileSystem with WithCmdRunner
commands/audit_enum_*_test.go Uses files.NewFileSystem with WithCmdRunner

All existing tests pass on both platforms. CI is green.

Comment thread commands/audit.go Outdated
Comment thread commands/audit_enum_unix.go Outdated
Comment thread commands/verify_unix_test.go
Comment thread policy/files/acl_unit_test_nonwindows.go Outdated
Comment thread commands/permissions_mocks_test.go Outdated
Comment thread commands/permissions.go Outdated
Comment thread commands/permissions.go Outdated
Comment thread commands/permissions.go Outdated
Comment thread commands/verify_test.go
Comment thread commands/permissions.go
@fdcastel
Copy link
Copy Markdown
Contributor Author

Awesome feedback, @EthanHeilman!! And great catches, too.

I’ll start working on these shortly.

…ve dead code

- Rename AuditCmd.FileSystem to Fs (merging with old afero.Fs field)
- Rename RequiredPerms.ProvidersDir to Providers (it's a file, not dir)
- Add RequiredPerms.Config for server_config.yml permission checks
- Add config.yml permission checking to permissions check/fix commands
- Fix providers to be treated as a file (chmod/chown) not a directory
- Pass actual perm param in mock MkdirAll/Chmod/WriteFile methods
- Pass RequiredPerms.PluginsDir.Group in plugins dir permission check
- Rename verify_test_unix.go to verify_unix_test.go (Go test naming)
- Remove acl_unit_test_nonwindows.go (skip-only test, no value)
- Remove expectedSystemOwner() and platform.go (trivial unused helper)
- Add license header to audit_windows_test.go
@fdcastel
Copy link
Copy Markdown
Contributor Author

All review feedback from the latest round has been addressed in commit d49f93a. Summary of changes:

Naming & structure:

  • Merged AuditCmd.Fs (afero.Fs) and AuditCmd.FileSystem (files.FileSystem) into a single Fs files.FileSystem field — now audit_enum_unix.go uses a.Fs.Exists()/a.Fs.ReadFile() instead of raw afero calls
  • Renamed RequiredPerms.ProvidersDirRequiredPerms.Providers (it's a file, not a directory)
  • Renamed verify_test_unix.goverify_unix_test.go so Go recognizes it as a test file
  • Removed expectedSystemOwner() and platform.go/platform_*_test.go — trivial helper with no real value
  • Removed acl_unit_test_nonwindows.go — skip-only test file, no value

Permissions checks:

  • Providers is now treated as a file throughout (chmod+chown, not mkdir)
  • Added RequiredPerms.Config for config.yml permission checks
  • permissions check and permissions fix now handle config.yml (chmod/chown when it exists)
  • Fixed plugins dir group check: now passes RequiredPerms.PluginsDir.Group instead of ""

Mock fixes:

  • mockFileSystem.MkdirAll, .Chmod, .WriteFile now use the actual perm parameter instead of hardcoded values
  • The Created/ChmodCalled/ChownCalled booleans are asserted in permissions_fix_nonwindows_test.go and permissions_install_test.go

Other:

  • Added Apache 2.0 license header to audit_windows_test.go

All 17 CI checks pass (including Windows tests and all integration tests).

Extract checkACLResult helper in permissions Check() to consistently
process ACL findings (report, errors, ACEs) for all checked files.
Previously only the system policy file had its ACL result inspected;
providers and config.yml silently ignored the ACLReport/ACLErr returned
by CheckFilePermissions.
Copy link
Copy Markdown
Member

@EthanHeilman EthanHeilman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is looks good enough to merge. There are some architectural changes I want to make in this code, but it will go quicker if I make them after windows support is merged.

@EthanHeilman EthanHeilman merged commit 0a566c4 into openpubkey:main Mar 23, 2026
17 checks passed
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Apr 28, 2026
##### [\`v0.14.0\`](https://github.com/openpubkey/opkssh/releases/tag/v0.14.0)

Adds support for sshing into windows servers.
Openssh 10.13 makes a breaking, non-backwards compatible change to how ssh certificates work, this breaks opkssh older than this release. This release creates a fix for this breaking change.

##### Changes

- feat: update to openpubkey 0.23.0 [@ianroberts](https://github.com/ianroberts) ([#510](openpubkey/opkssh#510))
- fix(ci): use `go run .` instead of `go run main.go` in gha workflow [@fdcastel](https://github.com/fdcastel) ([#506](openpubkey/opkssh#506))
- \[3/3] Add Windows SSH server support [@fdcastel](https://github.com/fdcastel) ([#480](openpubkey/opkssh#480))
- refactor: unify MockUserLookup into shared test helper package. Closes [#439](openpubkey/opkssh#439). [@fdcastel](https://github.com/fdcastel) ([#495](openpubkey/opkssh#495))
- Update CLI documentation @[github-actions\[bot\]](https://github.com/apps/github-actions) ([#500](openpubkey/opkssh#500))
- feat: add --inspect-cert and --verbose flags to login command. Closes [#353](openpubkey/opkssh#353). [@fdcastel](https://github.com/fdcastel) ([#497](openpubkey/opkssh#497))
- docs: Add GitHub Actions integration guide. Closes [#481](openpubkey/opkssh#481) [@fdcastel](https://github.com/fdcastel) ([#492](openpubkey/opkssh#492))
- test: cover full printed output of opkssh inspect. Closes [#356](openpubkey/opkssh#356) [@fdcastel](https://github.com/fdcastel) ([#493](openpubkey/opkssh#493))
- Update CLI documentation @[github-actions\[bot\]](https://github.com/apps/github-actions) ([#498](openpubkey/opkssh#498))
- Add `logout` command to remove opkssh-generated SSH keys. Closes [#317](openpubkey/opkssh#317). [@fdcastel](https://github.com/fdcastel) ([#496](openpubkey/opkssh#496))
- Update CLI documentation @[github-actions\[bot\]](https://github.com/apps/github-actions) ([#490](openpubkey/opkssh#490))
- \[2/3] Add permissions command [@fdcastel](https://github.com/fdcastel) ([#479](openpubkey/opkssh#479))
- bug: ensure provider arg doesn't skip remote-redirect-uri [@EthanHeilman](https://github.com/EthanHeilman) ([#471](openpubkey/opkssh#471))
- \[1/3] Update GitHub Actions workflows and .gitignore [@fdcastel](https://github.com/fdcastel) ([#478](openpubkey/opkssh#478))
- docs: Add AWS EC2 setup guide for opkssh [@Rishang](https://github.com/Rishang) ([#467](openpubkey/opkssh#467))

##### 🐛 Bug Fixes

- fix(deps): Update docker/build-push-action action to v7 @[renovate\[bot\]](https://github.com/apps/renovate) ([#512](openpubkey/opkssh#512))
- Fix for openssh 10.13 breaking principals wildcard in SSH certificates [@EthanHeilman](https://github.com/EthanHeilman) ([#513](openpubkey/opkssh#513))
- fix(deps): Update zizmorcore/zizmor-action action to v0.5.2 @[renovate\[bot\]](https://github.com/apps/renovate) ([#488](openpubkey/opkssh#488))
- fix(deps): Update dependency golangci/golangci-lint to v2.11.2 @[renovate\[bot\]](https://github.com/apps/renovate) ([#486](openpubkey/opkssh#486))
- fix(deps): Update goreleaser/goreleaser-action action to v7 @[renovate\[bot\]](https://github.com/apps/renovate) ([#484](openpubkey/opkssh#484))
- fix(deps): Update goreleaser/goreleaser-action action to v7 @[renovate\[bot\]](https://github.com/apps/renovate) ([#477](openpubkey/opkssh#477))
- fix(deps): Update actions/setup-go action to v6.3.0 @[renovate\[bot\]](https://github.com/apps/renovate) ([#482](openpubkey/opkssh#482))
- fix(deps): Update zizmorcore/zizmor-action action to v0.5.0 @[renovate\[bot\]](https://github.com/apps/renovate) ([#451](openpubkey/opkssh#451))
- fix(deps): Update Docker @[renovate\[bot\]](https://github.com/apps/renovate) ([#464](openpubkey/opkssh#464))

##### 🧰 Maintenance

- Improve install script to make linter happy, fix typo [@EthanHeilman](https://github.com/EthanHeilman) ([#514](openpubkey/opkssh#514))
sdwilsh pushed a commit to sdwilsh/ansible-playbooks that referenced this pull request Apr 30, 2026
##### [\`v0.14.0\`](https://github.com/openpubkey/opkssh/releases/tag/v0.14.0)

Adds support for sshing into windows servers.
Openssh 10.13 makes a breaking, non-backwards compatible change to how ssh certificates work, this breaks opkssh older than this release. This release creates a fix for this breaking change.

##### Changes

- feat: update to openpubkey 0.23.0 [@ianroberts](https://github.com/ianroberts) ([#510](openpubkey/opkssh#510))
- fix(ci): use `go run .` instead of `go run main.go` in gha workflow [@fdcastel](https://github.com/fdcastel) ([#506](openpubkey/opkssh#506))
- \[3/3] Add Windows SSH server support [@fdcastel](https://github.com/fdcastel) ([#480](openpubkey/opkssh#480))
- refactor: unify MockUserLookup into shared test helper package. Closes [#439](openpubkey/opkssh#439). [@fdcastel](https://github.com/fdcastel) ([#495](openpubkey/opkssh#495))
- Update CLI documentation @[github-actions\[bot\]](https://github.com/apps/github-actions) ([#500](openpubkey/opkssh#500))
- feat: add --inspect-cert and --verbose flags to login command. Closes [#353](openpubkey/opkssh#353). [@fdcastel](https://github.com/fdcastel) ([#497](openpubkey/opkssh#497))
- docs: Add GitHub Actions integration guide. Closes [#481](openpubkey/opkssh#481) [@fdcastel](https://github.com/fdcastel) ([#492](openpubkey/opkssh#492))
- test: cover full printed output of opkssh inspect. Closes [#356](openpubkey/opkssh#356) [@fdcastel](https://github.com/fdcastel) ([#493](openpubkey/opkssh#493))
- Update CLI documentation @[github-actions\[bot\]](https://github.com/apps/github-actions) ([#498](openpubkey/opkssh#498))
- Add `logout` command to remove opkssh-generated SSH keys. Closes [#317](openpubkey/opkssh#317). [@fdcastel](https://github.com/fdcastel) ([#496](openpubkey/opkssh#496))
- Update CLI documentation @[github-actions\[bot\]](https://github.com/apps/github-actions) ([#490](openpubkey/opkssh#490))
- \[2/3] Add permissions command [@fdcastel](https://github.com/fdcastel) ([#479](openpubkey/opkssh#479))
- bug: ensure provider arg doesn't skip remote-redirect-uri [@EthanHeilman](https://github.com/EthanHeilman) ([#471](openpubkey/opkssh#471))
- \[1/3] Update GitHub Actions workflows and .gitignore [@fdcastel](https://github.com/fdcastel) ([#478](openpubkey/opkssh#478))
- docs: Add AWS EC2 setup guide for opkssh [@Rishang](https://github.com/Rishang) ([#467](openpubkey/opkssh#467))

##### 🐛 Bug Fixes

- fix(deps): Update docker/build-push-action action to v7 @[renovate\[bot\]](https://github.com/apps/renovate) ([#512](openpubkey/opkssh#512))
- Fix for openssh 10.13 breaking principals wildcard in SSH certificates [@EthanHeilman](https://github.com/EthanHeilman) ([#513](openpubkey/opkssh#513))
- fix(deps): Update zizmorcore/zizmor-action action to v0.5.2 @[renovate\[bot\]](https://github.com/apps/renovate) ([#488](openpubkey/opkssh#488))
- fix(deps): Update dependency golangci/golangci-lint to v2.11.2 @[renovate\[bot\]](https://github.com/apps/renovate) ([#486](openpubkey/opkssh#486))
- fix(deps): Update goreleaser/goreleaser-action action to v7 @[renovate\[bot\]](https://github.com/apps/renovate) ([#484](openpubkey/opkssh#484))
- fix(deps): Update goreleaser/goreleaser-action action to v7 @[renovate\[bot\]](https://github.com/apps/renovate) ([#477](openpubkey/opkssh#477))
- fix(deps): Update actions/setup-go action to v6.3.0 @[renovate\[bot\]](https://github.com/apps/renovate) ([#482](openpubkey/opkssh#482))
- fix(deps): Update zizmorcore/zizmor-action action to v0.5.0 @[renovate\[bot\]](https://github.com/apps/renovate) ([#451](openpubkey/opkssh#451))
- fix(deps): Update Docker @[renovate\[bot\]](https://github.com/apps/renovate) ([#464](openpubkey/opkssh#464))

##### 🧰 Maintenance

- Improve install script to make linter happy, fix typo [@EthanHeilman](https://github.com/EthanHeilman) ([#514](openpubkey/opkssh#514))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants