需求
对于管理员来说,机密管理是一个绕不过去的槛。我个人管理着10多台网络设备,10多台Server、ESXI、SQL SERVER、ERP、企业的WEB应用,还有个人的几台设备,各种网站的登录信息。怎么安全便捷的管理和使用这些信息?手机APP让很多人免于被账户密码支配的恐惧。WEB应用还有一部分场景是不可取代的,信息密集型、操作密集型、历史遗留、PC端。IT管理环境也同样,要记录一堆的主机名,用户名,密码。
WEB端
使用浏览器的密码管理功能,国内还是用微软的Edge.您需要有一个Microsfot账户,手机APP下载'Microsofot Authenticator'。Microsoft账户的安全设置,和浏览器密码的安全设置。
PC端保存机密
安装两个模块:
Install-Module Microsoft.PowerShell.SecretManagement
Install-Module Microsoft.PowerShell.SecretStore
我们来配置和存储一个示例:
Register-SecretVault -Name MyStore -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
# Windows 用户凭证
$c = Get-Credential -Credential Admin
Set-Secret -Name tencent-t1 -Secret $c -Metadata @{Host="IP";Des="腾讯云的Windows server 2019测试主机"}
#明文密码
Set-Secret -Name Route -Secret 'Pass@word#1' -Metadata @{Host="10.0.0.1";Des="出口路由器";UserName='Admin'}
get-secret -Name Route -AsPlainText
(Get-Secretinfo -Name route).Metadata.Host
(Get-Secretinfo -Name route).Metadata.UserName
Windows 用户凭证: 请注意:Metadata的值需要是一个哈希表。语法是@{key=value,key1=value1}@符号我经常忘记。这个Metadata的值我是把它当注释来用的。 明文密码:
使用机密
$c = Get-Secret -Name Tencent-t1
# 请注意'Metadata.'后面的值,也就是哈希表的Key是区分大小写的。Metadata.host取不到值的,需要Metadata.Host
$remotehost = (Get-SecretInfo -Name tencent-t1).Metadata.Host
$Session = New-PSSession -ComputerName $remotehost -Credential $c
#icm 是Invoke-Command的别名。
icm -Session $Session {Get-Service -Name bits}
当然写个函数返回Session,和SSh连接的字符串是一件很容易的事情。甚至可以写一个脚本,输入想要连接的主机,返回连接信息也很方便。这种比在脚本中存储明文密码,或者在文本中存储明文密码要安全一些。 给出一个获取PSsession的函数,没有做错误处理,做个参考吧。
Function Get-RmSession{
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[String]
$HostName
)
$c = Get-Secretinfo | Where-Object {$_.Metadata.Host -eq $HostName} | Get-Secret
$Session = New-PSSession -ComputerName $HostName -Credential $c
$Session
}
官方文档:实用工具模块