sources/Google.Solutions.IapDesktop.Extensions.Session/Settings/SshSettings.cs (104 lines of code) (raw):
//
// Copyright 2020 Google LLC
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
using Google.Solutions.Common.Util;
using Google.Solutions.IapDesktop.Application.Profile;
using Google.Solutions.IapDesktop.Core.ObjectModel;
using Google.Solutions.IapDesktop.Extensions.Session.Protocol.Ssh;
using Google.Solutions.Settings;
using Google.Solutions.Settings.Collection;
using Google.Solutions.Ssh.Cryptography;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
namespace Google.Solutions.IapDesktop.Extensions.Session.Settings
{
/// <summary>
/// SSH-related settings.
/// </summary>
public interface ISshSettings : ISettingsCollection
{
/// <summary>
/// Enable propagation of current locate.
/// </summary>
ISetting<bool> EnableLocalePropagation { get; }
/// <summary>
/// Gets or sets the validity of public keys uploaded
/// to OS Login or metadata.
/// </summary>
ISetting<int> PublicKeyValidity { get; }
/// <summary>
/// Type of public key to use. This determines the
/// algorithm for public key use authentication.
/// </summary>
ISetting<SshKeyType> PublicKeyType { get; }
/// <summary>
/// Controls whether the SSH signing key is stored in the
/// local key store.
/// </summary>
ISetting<bool> UsePersistentKey { get; }
/// <summary>
/// Controls whether SFTP file access is allowed.
/// </summary>
ISetting<bool> EnableFileAccess { get; }
}
/// <summary>
/// Registry-backed repository for SSH settings.
///
/// Service is a singleton so that objects can subscribe to events.
/// </summary>
[Service(typeof(IRepository<ISshSettings>), ServiceLifetime.Singleton)]
public class SshSettingsRepository : GroupPolicyAwareRepository<ISshSettings>
{
private readonly UserProfile.SchemaVersion schemaVersion;
internal SshSettingsRepository(
RegistryKey settingsKey,
RegistryKey? machinePolicyKey,
RegistryKey? userPolicyKey,
UserProfile.SchemaVersion schemaVersion)
: base(settingsKey, machinePolicyKey, userPolicyKey)
{
Precondition.ExpectNotNull(settingsKey, nameof(settingsKey));
this.schemaVersion = schemaVersion;
}
public SshSettingsRepository(UserProfile profile)
: this(
profile.SettingsKey.CreateSubKey("Ssh"),
profile.MachinePolicyKey?.OpenSubKey("Ssh"),
profile.UserPolicyKey?.OpenSubKey("Ssh"),
profile.Version)
{
profile.ExpectNotNull(nameof(profile));
}
protected override ISshSettings LoadSettings(ISettingsStore store)
=> new SshSettings(store, this.schemaVersion);
//---------------------------------------------------------------------
// Inner class.
//---------------------------------------------------------------------
internal class SshSettings : ISshSettings
{
public ISetting<bool> EnableLocalePropagation { get; }
public ISetting<int> PublicKeyValidity { get; }
public ISetting<SshKeyType> PublicKeyType { get; }
public ISetting<bool> UsePersistentKey { get; }
public ISetting<bool> EnableFileAccess { get; }
public IEnumerable<ISetting> Settings => new ISetting[]
{
this.EnableLocalePropagation,
this.PublicKeyValidity,
this.PublicKeyType,
this.UsePersistentKey,
this.EnableFileAccess
};
internal SshSettings(
ISettingsStore store,
UserProfile.SchemaVersion schemaVersion)
{
//
// Settings that can be overridden by policy.
//
// NB. Default values must be kept consistent with the
// ADMX policy templates!
//
//
// NB. Initially, the default key type was Rsa3072,
// but rsa-ssh is deprecated and many users's machines
// aren't allowed to use RSA. Therefore, use ECDSA as
// default for newly created profiles.
//
this.PublicKeyType = store.Read<SshKeyType>(
"PublicKeyType",
"PublicKeyType",
"Key type for public key authentication",
null,
schemaVersion >= UserProfile.SchemaVersion.Version229
? SshKeyType.EcdsaNistp384
: SshKeyType.Rsa3072);
this.PublicKeyValidity = store.Read<int>(
"PublicKeyValidity",
"PublicKeyValidity",
"Validity of (OS Login/Metadata) keys in seconds",
null,
(int)SshParameters.DefaultPublicKeyValidity.TotalSeconds,
Predicate.InRange(
(int)TimeSpan.FromMinutes(1).TotalSeconds,
int.MaxValue));
this.UsePersistentKey = store.Read<bool>(
"UsePersistentKey",
"UsePersistentKey",
"Persist SSH signing key",
null,
true);
this.EnableLocalePropagation = store.Read<bool>(
"IsPropagateLocaleEnabled",
"IsPropagateLocaleEnabled",
null,
null,
true);
this.EnableFileAccess = store.Read<bool>(
"EnableFileAccess",
"EnableFileAccess",
null,
null,
true);
}
}
}
}