[TOC]

0x00 前言简述

1.简单介绍

Q: Windows Server 中的服务器核心安装选项是什么?

答: “服务器核心” 选项是在部署 Windows Server Standard 或 Datacenter 版本时可用的最小安装选项。 服务器核心包括大多数但并非全部服务器角色。

Tips : 微软介绍服务器核心时说道其降低的硬件要求、磁盘占用量较小,减小了更新需求因此攻击面更小。
Tips : 在设计上服务器核心中没有桌面,虽然维护支持传统的业务应用程序和基于角色的工作负荷所需的功能,但服务器核心没有传统的桌面界面。 相反,服务器核心旨在通过命令行、PowerShell 或 GUI 工具进行远程管理 (如 RSAT 或 Windows 管理中心) 。


Q: 服务器 (核心) vs Server 桌面体验?

1.Server Core : 安装消除了对某些常用服务器角色的支持不是必需的任何服务和其他功能, 例如 Hyper-v 服务器不需要图形用户界面 (GUI) ,因为你可以从命令行使用 Windows PowerShell 或使用 Hyper-v 管理器远程管理 Hyper-v 的所有方面。
2.Server 桌面体验: 安装选项的服务器仍将安装许多服务和其他组件而这些组件通常不需要用于特定的使用方案。

除了不提供UI界面外其主要区别如下:

  • 1.Windows系统的资源管理器explorer没有了。
  • 2.依赖MMC的控制台界面没有了意味着运行*.msc的命令将无法打开。
  • 3.控制面板选项control也没有了。
  • 4.Window Internet Explorer也没有了。
  • 5.服务器核心没有任何辅助工具
  • 6.没有用于设置服务器核心的 OOBE (全新体验)
  • 7.无音频支持


2.版本区别

描述: 下表显示了在具有桌面体验的服务器核心与服务器上本地可用的应用程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
应用程序 	Server Core 	服务器(提供桌面体验)
命令提示符 可用 可用
Windows PowerShell/Microsoft .NET 可用 可用
Perfmon.exe 不可用 可用
Windbg (GUI) 受支持 受支持
Resmon.exe 不可用 可用
Regedit 可用 可用
Fsutil.exe 可用 可用
Disksnapshot.exe 不可用 可用
Diskpart.exe 可用 可用
Diskmgmt.msc 不可用 可用
Devmgmt.msc 不可用 可用
服务器管理器 不可用 可用
Mmc.exe 不可用 可用
Eventvwr.msc 不可用 可用
Wevtutil (事件查询) 可用 可用
Services.msc 不可用 可用
控制面板 不可用 可用
Windows 更新 (GUI) 不可用 可用
Windows 资源管理器 不可用 可用
任务栏 不可用 可用
任务栏通知 不可用 可用
任务管理器 可用 可用
Internet Explorer 或 Edge 不可用 可用
内置帮助系统 不可用 可用
Windows 10 Shell 不可用 可用
Windows Media Player 不可用 可用
PowerShell 可用 可用
PowerShell ISE 不可用 可用
PowerShell 输入法 可用 可用
Mstsc.exe 不可用 可用
远程桌面服务 可用 可用
Hyper-V 管理器 不可用 可用
记事本* 不可用 可用


3.参考来源


0x01 Server-Core 安装部署

1.环境准备

描述: 在此处准备如下列环境进行Server-Core 2019标准版(不带桌面)的操作系统安装。

  • (1) vSphere ESXI((博主的环境) 或者 WorkStation
  • (2) Server-Core 基础配置 4G 4C 80GB(磁盘);
  • (3) ISO 操作系统: cn_windows_server_2019_updated_march_2019_x64_dvd_c1ffb46c.iso


2.安装流程

描述: Server Core 的其安装流程大致与桌面版本的安装流程差距不大,下面进行简要说明。

  • Step 1.在 VMware ESXi 上创建 Windows Server Core 2019 的虚拟机。

    WeiyiGeek.VMware ESXi

    WeiyiGeek.VMware ESXi

  • Step 2.启动虚拟机点击下一步-> 我没有产品密钥 (I) -> 选择Server 2019 Standard不带桌面体验的 -> 选择安装磁盘 -> 进行Windows 系统的安装。

    WeiyiGeek.Server 2019 Standard

    WeiyiGeek.Server 2019 Standard

    Tips : 不带“桌面体验”的版本是”服务器核心”安装选项

  • Step 3.安装完成后,通过VMware远程会话连接进去之后,里面全是黑乎乎的一个命令行其它啥也没有;首次需要进行用户密码更改 -> 输入系统密码 -> 完成后会出现cmd命令行

    WeiyiGeek.Server Core 初始化设置

    WeiyiGeek.Server Core 初始化设置

0x02 Server-Core 管理配置

描述: 由于服务器核心没有UI因此需要使用 Windows PowerShell cmdlet、命令行工具或远程工具来执行基本的管理任务,在使用上更像是在Linux上的命令行而在Core中则采用PowerShell进行系统的主要管理,在PS中随处都可以看见Linux Shell的影子例如ls、wget|curl(别名指向的是Invoke-WebRequest)。

参考地址: https://docs.microsoft.com/zh-cn/windows-server/administration/server-core/server-core-administer


1.服务器IP地址及DNS设置

描述: 安装服务器核心服务器时,默认情况下它具有 DHCP 地址。如果需要静态 IP 地址,可以使用以下步骤进行设置。

1
2
3
4
5
6
7
8
9
10
# - 1.运行 get-netipinterface 查看 IP 接口的 IfIndex 列中的数字或 InterfaceDescription 字符串。

# - 2. 运行以下 cmdlet 以设置静态 IP 地址:
New-NetIPaddress -InterfaceIndex 5 -IPAddress 10.10.107.220 -PrefixLength 24 -DefaultGateway 10.10.107.1

# - 3.添加多个 DNS 服务器,请运行以下 cmdlet
Set-DNSClientServerAddress -InterfaceIndex 5 -ServerAddresses 223.6.6.6,223.5.5.5

# - 4.如果需要切换到使用 DHCP 请运行下面的cmdlet
DnsClientServerAddress -InterfaceIndex 12 – ResetServerAddresses。

WeiyiGeek.IP地址及DNS设置

WeiyiGeek.IP地址及DNS设置


2.重命名服务器名称

描述: 使用以下步骤重命名服务器

1
2
3
4
5
6
7
# - 1.使用 hostname 或 ipconfig 命令确定服务器的当前名称。

# - 2.运行 rename-Computer <new_name> ComputerName
Rename-Computer WeiyiGeek

# - 3.重新启动计算机。
Restart-Computer


3.将服务器加入到域中

描述: 使用以下cmdlet将计算机加入域。

1
2
3
4
5
6
7
8
# -1.系统将提示您输入加入域的凭据和域名。
Add-Computer

# -2.如果需要将域用户帐户添加到本地Administrators组,请在命令提示符下(不在PowerShell窗口中)运行以下命令:
net localgroup administrators /add <DomainName>\<UserName>

# -3.您可以通过运行“重新启动计算机”来完成此操作。
Restart-Computer


4.激活安装的服务器

1
2
3
4
5
6
7
8
9
# - 1.提供操作系统相对应的密钥进行激活
slmgr.vbs -ipk <productkey>
# slmgr.vbs -ipk WMDGN-G9PQG-XVVXX-R3X43-63DFG

# - 2.如果激活成功,您将不会收到消息。
slmgr.vbs -ato

# - 3.您还可以通过电话、使用密钥管理服务(KMS)服务器或远程激活服务器。要远程激活,请从远程计算机运行以下cmdlet:
cscript windows\system32\slmgr.vbs <ServerName> <UserName> <password>:-ato


5.启用Server的远程桌面

描述: 虽然 Server Core 不提供mstsc.exe 远程桌面连接工具但可以提供远程连接的服务,便于我们客户端可以使用远程桌面工具进行连接。

但默认情况下Windows Server 2019将外部远程桌面访问设置为禁用作为安全措施,我们可以轻松地从PowerShell中启用它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# - 1.我们可以使用Set-ItemPropery cmdlet修改启用(0)或禁用(1)远程桌面的注册表值:
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0

# - 2.使用'Enable-NetFirewallRule'配置Windows防火墙以允许远程桌面连接:
New-NetFirewallRule -Name "RDP" -DisplayName "Remote Desktop Services" -Description "Remote Desktop Services" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 3389
# Name : RDP
# DisplayName : Remote Desktop Services
# Description :
# DisplayGroup :
# Group :
# Enabled : True
# Profile : Any
# Platform : {}
# Direction : Inbound
# Action : Allow
# EdgeTraversalPolicy : Block
# LooseSourceMapping : False
# LocalOnlyMapping : False
# Owner :
# PrimaryStatus : OK
# Status : 已从存储区成功分析规则。 (65536)
# EnforcementStatus : NotApplicable
# PolicyStoreSource : PersistentStore
# PolicyStoreSourceType : Local

# - 3.启用远程桌面服务
Get-Service -DisplayName "*Remote Desktop Services*" | Start-Service -passthru
Status Name DisplayName
------ ---- -----------
Running TermService Remote Desktop Services
Running UmRdpService Remote Desktop Services UserMode Po...

# - 4.在我们的客户端执行mstsc.msc进行连接到Core服务器中
mstsc.exe /admin
WeiyiGeek.Core-Server

WeiyiGeek.Core-Server


5.启用Windows PowerShell远程管理

描述: 您可以启用Windows PowerShell远程处理,即在一台计算机上的Windows PowerShell中键入的命令在另一台计算机上运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -1.使用Enable-PSRemoting启用Windows PowerShell远程处理。
Enable-PSRemoting -Force

# -2.设置当前机器防火墙允许ICMPv4协议入站规则。
New-NetFirewallRule -DisplayName "Allow Ping" -Description "Allow ping" -Protocol ICMPv4 -IcmpType 8 -Enabled True -Profile Any -Action Allow

# -3.设置core服务器的进行WINRM管理的防护墙通信规则(如果安全组有限制, 请开放对此机器入方向的5985(HTTP)和5986(HTTPS)端口)
Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress Any

# -4.本地客户端机器上执行如下命令
PS C:\WINDOWS\system32> Get-Service winrm | Start-Service
PS C:\WINDOWS\system32> Set-Item WSMan:localhost\client\trustedhosts -value 10.10.107.220 -Force
PS C:\WINDOWS\system32> Enter-PsSession -ComputerName 10.10.107.220

# -5.执行命令验证
hostname
WeiyiGeek.Enter-PsSession

WeiyiGeek.Enter-PsSession


6.使用OpenSSH远程管理Windows

描述: OpenSSH 是安全 Shell (SSH) 工具的开放源代码版本,Linux 及其他非 Windows 系统的管理员使用此类工具跨平台管理远程系统,OpenSSH 在 2018 年秋季已添加至 Windows,并包含在 Windows 10 和 Windows Server 2019 中。

OpenSSH 是一款用于远程登录的连接工具,它使用 SSH 协议。它会加密客户端与服务器之间的所有流量,从而遏止窃听、连接劫持和其他攻击, SSH 是基于客户端-服务器体系结构,用户在其中工作的系统是客户端,所管理的远程系统是服务器,

其包含一系列组件和工具,用于提供一种安全且简单的远程系统管理方法,其中包括:

  • sshd.exe: 它是远程所管理的系统上必须运行的 SSH 服务器组件
  • ssh.exe: 它是在用户的本地系统上运行的 SSH 客户端组件
  • ssh-keygen.exe: 为 SSH 生成、管理和转换身份验证密钥
  • ssh-agent.exe: 存储用于公钥身份验证的私钥
  • ssh-add.exe: 将私钥添加到服务器允许的列表中
  • ssh-keyscan.exe: 帮助从许多主机收集公用 SSH 主机密钥
  • sftp.exe: 这是提供安全文件传输协议的服务,通过 SSH 运行
  • scp.exe: 是在 SSH 上运行的文件复制实用工具

Tips: 主 OpenSSH 开源项目是由 OpenBSD 项目的开发人员管理的。 此项目的 Microsoft 分支在 GitHub 中(https://github.com/PowerShell/openssh-portable)

1) 使用 PowerShell 安装 OpenSSH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# - 1.若要使用 PowerShell 安装 OpenSSH,请先以管理员身份运行 PowerShell
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
# Name : OpenSSH.Client~~~~0.0.1.0
# State : Installed
# Name : OpenSSH.Server~~~~0.0.1.0
# State : NotPresent

# - 2.然后根据需要安装服务器或客户端组件(上面可以看见Client已经安装)下面我们直接安装Server端即可
# Install the OpenSSH Client
# Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

# - 3.安装完成会返回以下输出:
Path :
Online : True
RestartNeeded : False


2) 启动并配置 OpenSSH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# - 4.启动并配置 SSH 服务器自动启动
Get-Service sshd | Start-Service -PassThru
Get-Service sshd | Set-Service -StartupType 'Automatic'
# Status Name DisplayName
# ------ ---- -----------
# Running sshd OpenSSH SSH Server

# - 5.防火墙规则查看应该有一个名为“OpenSSH Server In TCP”的防火墙规则,应该启用该规则
Get-NetFirewallRule -Name *ssh*
# Name : OpenSSH-Server-In-TCP
# DisplayName : OpenSSH SSH Server (sshd)
# Description : Inbound rule for OpenSSH SSH Server (sshd)
# DisplayGroup : OpenSSH Server
# Group : OpenSSH Server
# Enabled : True
# Profile : Any
# Platform : {}
# Direction : Inbound
# Action : Allow
# EdgeTraversalPolicy : Block
# LooseSourceMapping : False
# LocalOnlyMapping : False
# Owner :
# PrimaryStatus : OK
# Status : 已从存储区成功分析规则。 (65536)
# EnforcementStatus : NotApplicable
# PolicyStoreSource : PersistentStore
# PolicyStoreSourceType : Local
Get-NetFirewallRule -Name *ssh* | Get-NetFirewallPortFilter
# Protocol : TCP
# LocalPort : 22
# RemotePort : Any
# IcmpType : Any
# DynamicTarget : Any
#如果防火墙不存在,请创建一个
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

Tips : 安装 OpenSSH 服务器将创建并启用一个名为 OpenSSH-Server-In-TCP 的防火墙规则。 这允许端口 22 上的入站 SSH 流量。 如果未启用此规则且未打开此端口,那么连接将被拒绝或重置。

3) 连接OpenSSH服务端

1
2
3
4
5
6
7
8
9
10
11
# - 6.本地SSH客户端连接到远程Windows Server Core服务器上。(请务必以管理员身份运行)
PS C:\WINDOWS\system32> ssh [email protected]
# The authenticity of host '10.10.107.220 (10.10.107.220)' can't be established.ECDSA key fingerprint is SHA256:2gsICyg/iN268lJ6RzAtf7lsRr7yUG4qLAnQIjSKEio.
# Are you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added '10.10.107.220' (ECDSA) to the list of known hosts.
# 系统此时会提示你输入密码。 作为安全预防措施,密码在键入的过程中不会显示。
# [email protected]'s password:
# Microsoft Windows [版本 10.0.17763.379] # 默认是以 Windows Command shell (cmd.exe) 作为终端
# (c) 2018 Microsoft Corporation。保留所有权利。
# 连接后,你将看到 Windows 命令行界面提示符:
[email protected] C:\Users\Administrator>hostname
WeiyiGeek


4) 为 Windows 中的 OpenSSH 配置默认 shell
描述: 在 Windows 中 sshd 默认情况下从 %programdata%\ssh\sshd_config 中读取配置数据,也可以通过使用 -f 参数启动 sshd 来指定不同的配置文件,如果该文件不存在,则在启动该服务时,sshd 将使用默认配置生成一个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# - 1.配置文件查看
[email protected] C:\ProgramData\ssh>more C:\ProgramData\ssh\sshd_config

# - 2.通过将 shell 可执行文件的完整路径添加到 \SOFTWARE\OpenSSH 字符串值 DefaultShell 中的 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH,在 Windows 注册表中配置默认 ssh shell。
# 例如,以下 Powershell 命令将默认 shell 设置为 PowerShell.exe:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
# DefaultShell : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
# PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
# PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
# PSChildName : OpenSSH
# PSDrive : HKLM
# PSProvider : Microsoft.PowerShell.Core\Registry

# - 3.登陆验证查看配置是否生效
PS C:\WINDOWS\system32> ssh [email protected]
# [email protected]'s password:
# Windows PowerShell # 切换后采用
# 版权所有 (C) Microsoft Corporation。保留所有权利。


5) OpenSSH 密钥管理
描述:对于 Windows OpenSSH 的 AuthenticationMethods,唯一可用的身份验证方法是“password”和“publickey”。Windows 环境中的大多数身份验证都是使用用户名-密码(password)对完成的适用于共享公共域的系统(可能会导致关键信息泄露),跨域工作时(例如在本地和云托管的系统之间)很容易受到暴力攻击入侵。所以相比之下 Linux 环境通常使用公钥/私钥(publickey)对来驱动身份验证,这不要求使用可推测的密码。 OpenSSH 提供了工具来帮助支持此用途,具体如下:

  • ssh-keygen ,用于生成安全的密钥
  • ssh-agent 和 ssh-add ,用于安全地存储私钥
  • scp 和 sftp ,在首次使用服务器时安全地复制公钥文件

Tips : 密钥对指的是由特定的身份验证协议使用的公钥和私钥文件, SSH 公钥身份验证使用不对称加密算法来生成两个密钥文件一个为“私钥”文件,一个为“公钥”文件

  • Step 1.主机密钥生成:其具有特定的 ACL 要求,在 Windows 上这些要求等同于仅允许管理员和 System 进行访问,若要使用 SSH 服务器轻松进行密钥身份验证,请在权限提升的 PowerShell 提示符下运行以下命令:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 已创建了 OpenSSHUtils PowerShell 模块来正确设置密钥 ACL,并且应当将该模块安装在服务器上
    Install-Module -Force OpenSSHUtils -Scope AllUsers

    # 首次使用 sshd 时,将自动生成主机的密钥对。如果 ssh-agent 正在运行则密钥将自动添加到本地存储中。
    Get-Service -Name ssh-agent | Set-Service -StartupType Manual

    # 启动ssh代理服务以保留服务器密钥
    Start-Service ssh-agent

    # 现在启动sshd服务
    Start-Service sshd

Tips : 由于没有与 sshd 服务关联的用户,因此主机密钥存储在 \ProgramData\ssh 下。

  • Step 2.用户密钥生成: 若要使用基于密钥的身份验证,首先需要为客户端生成一些公钥/私钥对。通过 PowerShell 或 cmd使用 ssh-keygen 生成一些密钥文件。

    1
    2
    3
    4
    5
    # - 密钥生成与Linux类似采用 ssh-keygen命令(可采用-t指定密钥类型)
    cd ~\.ssh\
    ssh-keygen

    # - 现在你有了一个公钥/私钥 ED25519 密钥对(.pub 文件是公钥,其余的是私钥):
  • Step 3.私钥文件等效于密码应当采用与保护密码相同的方式来保护它。为了实现此目的请使用 ssh-agent 来将私钥安全地存储在与你的 Windows 登录关联的 Windows 安全上下文中。 为执行该操作,请以管理员身份启动 ssh-agent 服务并使用 ssh-add 来存储私钥。

  • Step 4.公钥部署: 若要使用上面创建的用户密钥,需要将公钥放置在服务器上的一个文本文件中,该文件名为 authorized_keys,位于 users\username\.ssh\ 下, 将公钥 (~.ssh\id_ed25519.pub) 的内容移动到服务器/主机上 ~.ssh 中名为 authorized_keys 的文本文件中。

此示例使用了之前在上面的说明中在主机上安装的 OpenSSHUtils 模块中的 Repair-AuthorizedKeyPermissions函数。

1
2
3
4
5
6
7
8
# Make sure that the .ssh directory exists in your server's home folder
ssh [email protected]@contoso.com mkdir C:\users\user1\.ssh\

# Use scp to copy the public key file generated previously to authorized_keys on your server
scp C:\Users\user1\.ssh\id_ed25519.pub [email protected]@contoso.com:C:\Users\user1\.ssh\authorized_keys

# Appropriately ACL the authorized_keys file on your server
ssh --% [email protected]@contoso.com powershell -c $ConfirmPreference = 'None'; Repair-AuthorizedKeyPermission C:\Users\user1\.ssh\authorized_keys

Tips : AuthorizedKeysFile 默认值为“.ssh/authorized_keys .ssh/authorized_keys2”。 如果路径不是绝对路径,则它相对于用户的主目录(或配置文件图像路径)。
请注意如果用户属于管理员组,则改为使用 %programdata%/ssh/administrators_authorized_keys。

Tips : 这些步骤完成了对 Windows 上的 SSH 使用基于密钥的身份验证所需的配置,完成此项后用户可以从具有私钥的任何客户端连接到 sshd 主机。

6) 使用 PowerShell 卸载 OpenSSH

1
2
3
4
5
6
# - 7.使用 PowerShell 卸载 OpenSSH (如果在卸载时服务正在使用中,稍后可能需要重启 Windows。)
# Uninstall the OpenSSH Client
Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Uninstall the OpenSSH Server
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0