Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Credentials are not passed along with REST backend #397

Closed
schemen opened this issue Mar 15, 2021 · 6 comments · Fixed by #927
Closed

Credentials are not passed along with REST backend #397

schemen opened this issue Mar 15, 2021 · 6 comments · Fixed by #927
Labels
bug Something isn't working

Comments

@schemen
Copy link

schemen commented Mar 15, 2021

Describe the bug

Using the rest backend, with the --private-repos option enabled, it seems that k8up is not correctly passing the credentials.

Additional context

I'm using the --private-repos, meaning every user has it's own URL. It would be great if k8up appends the username to the URL itself but that might be a feature request. It could be handled within this bug report though as it seems to affect a similar thing.

https://github.com/restic/rest-server

Logs & config

Without repo url:

E0315 09:35:26.125655       1 logging.go:127] wrestic/RepoInit/restic "msg"="Fatal: create repository at rest:https://restic.example.com:8888/ failed: Fatal: server response unexpected: 401 Unauthorized (401)" "error"="error during command"  
E0315 09:35:26.127959       1 logging.go:127] wrestic/RepoInit/restic "msg"="" "error"="error during command"  
E0315 09:35:26.128732       1 main.go:82] wrestic "msg"="failed to inialise the repository" "error"="cmd.Wait() err: 1"  

With repo url:

E0315 09:40:29.530192       1 logging.go:127] wrestic/RepoInit/restic "msg"="Fatal: create repository at rest:https://restic.example.com:8888/k8up_example_project/ failed: Fatal: server response unexpected: 401 Unauthorized (401)" "error"="error during command"  
E0315 09:40:29.532682       1 logging.go:127] wrestic/RepoInit/restic "msg"="" "error"="error during command"  
E0315 09:40:29.536866       1 main.go:82] wrestic "msg"="failed to inialise the repository" "error"="cmd.Wait() err: 1"  

Passing the entire url with basic auth data works:

I0315 09:41:50.887671       1 logging.go:118] wrestic/RepoInit/restic "level"=0 "msg"="created restic repository aa6023aff6 at rest:https://k8up_example_project:[email protected]:8888/k8up_example_project"  
I0315 09:41:50.887748       1 logging.go:118] wrestic/RepoInit/restic "level"=0 "msg"=""  
I0315 09:41:50.887774       1 logging.go:118] wrestic/RepoInit/restic "level"=0 "msg"="Please note that knowledge of your password is required to access"  
I0315 09:41:50.887798       1 logging.go:118] wrestic/RepoInit/restic "level"=0 "msg"="the repository. Losing your password means that your data is"  
I0315 09:41:50.887817       1 logging.go:118] wrestic/RepoInit/restic "level"=0 "msg"="irrecoverably lost."  
I0315 09:41:50.895233       1 snapshots.go:39] wrestic/snapshots "level"=0 "msg"="getting list of snapshots"  
I0315 09:41:51.723765       1 pod_list.go:50] wrestic/k8sClient "level"=0 "msg"="listing all pods"  "annotation"="k8up.syn.tools/backupcommand" "namespace"="example_project"
I0315 09:41:51.782518       1 main.go:177] wrestic "level"=0 "msg"="all pod commands have finished successfully"  

Backup config:

apiVersion: backup.appuio.ch/v1alpha1
kind: Backup
metadata:
  name: backup
spec:
  keepJobs: 4
  backend:
    repoPasswordSecretRef:
      name: backup-credentials
      key: encryption-key
    rest:
      url: https://k8up_example_project:[email protected]:8888/k8up_example_project
      userSecretRef:
        name: backup-credentials
        key: username
      passwordSecretReg:
        name: backup-credentials
        key: password

Expected behavior

The password and user from the secret are actually used to connect to the restic URL. I only want to define the actual URL of the restic instance.

To Reproduce

Steps to reproduce the behavior:

  1. Specs
apiVersion: backup.appuio.ch/v1alpha1
kind: Backup
metadata:
  name: backup
spec:
  keepJobs: 4
  backend:
    repoPasswordSecretRef:
      name: backup-credentials
      key: encryption-key
    rest:
      url: https://restic.example.com:8888/k8up_example_project
      userSecretRef:
        name: backup-credentials
        key: username
      passwordSecretReg:
        name: backup-credentials
        key: password
  1. Commands
kubectl apply -f backup.yaml

Environment (please complete the following information):

  • Image Version: v1.0.3
  • K8s Version: v1.20.0+k3s2
  • K8s Distribution: K3s
@schemen schemen added the bug Something isn't working label Mar 15, 2021
@ccremer
Copy link
Contributor

ccremer commented Mar 15, 2021

When the REST backend is configured, K8up should create the wrestic pod with USER and PASSWORD environment variables. Can you confirm that those were passed along to the pod with the expected values?

@ccremer
Copy link
Contributor

ccremer commented Nov 25, 2021

Closing due to no activity. Please respond if there's still an issue

@ccremer ccremer closed this as completed Nov 25, 2021
@pczerkas
Copy link

pczerkas commented Aug 28, 2022

Still an issue:

Schedule:

`backend:

repoPasswordSecretRef:
  name: backup-repo-secret
  key: password
rest:
  # URL of the Rest server instance (include scheme like https:// on your own)
  url: http://restic.int.pczerkas.info:8000/restic
  # Kubernetes secret reference containing the basic auth user
  userSecretRef:
    name: backup-credentials-secret
    key: username
  # Kubernetes secret reference containing the basic auth password
  passwordSecretReg:
    name: backup-credentials-secret
    key: password`

Pod logs:

1.6617079835027344e+09 INFO k8up Starting k8up… {"version": "2.4.0", "date": "2022-07-15T12:46:47Z", "commit": "37fc6af9487af5485d15c8b7608f31627419c1db", "go_os": "linux", "go_arch": "amd64", "go_version": "go1.18.3", "uid": 65532, "gid": 0}
1.6617079835033963e+09 INFO k8up.restic initializing
1.6617079835034695e+09 INFO k8up.restic setting up a signal handler
1.6617079835036757e+09 INFO k8up.restic.restic using the following restic options {"options": [""]}
1.661707983503756e+09 INFO k8up.restic.restic.RepoInit.command restic command {"path": "/usr/local/bin/restic", "args": ["init", "--option", ""]}
1.661707983503798e+09 INFO k8up.restic.restic.RepoInit.command Defining RESTIC_PROGRESS_FPS {"frequency": 0.016666666666666666}
1.6617079835273046e+09 INFO k8up.restic.restic.RepoInit.restic.stderr Fatal: create repository at rest:http://restic.int.pczerkas.info:8000/restic/ failed: Fatal: server response unexpected: 401 Unauthorized (401)
1.6617079835274544e+09 INFO k8up.restic.restic.RepoInit.restic.stderr
2022/08/28 17:33:03 unable to start k8up: failed to initialise the restic repository: cmd.Wait() err: 1
`

USER and PASSWORD environment variables are set in pod:
image

@ccremer ccremer reopened this Sep 5, 2022
@Kidswiss
Copy link
Contributor

Kidswiss commented Sep 5, 2022

It looks like the credentials for the rest connection don't need to be passed as env vars at all: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html#rest-server

@pczerkas could you please test if it works with url: http://username:[email protected]:8000/restic?

If so we'd have to adjust the logic a bit and add it from the secrets to the URL.

@JcGKitten
Copy link
Contributor

Hey @Kidswiss,
I tested it with the hardcoded user and password in the url and then I didn't get the unauthorized error anymore. So yes this needs fixing.
Thanks.

@JcGKitten
Copy link
Contributor

In k8up/api/v1/backend.go would it need a change like

func (in *RestServerSpec) String() string {
        protocol, url, _ := strings.Cut(in.URL, "://")
	return fmt.Sprintf("rest:%s://%s:%s@%s", protocol, in.UserSecretRef, in.PasswordSecretReg, url)
}

?
But I'm not really familiar with go and programming for k8s. I guess it needs more to hide the password in the resource descriptions etc.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants