Armazenar hosts do mRemoteNG no Microsoft SQL Server

Esse artigo demonstra como configurar o mRemoteNG para armzenar os dados de servidores num banco de dados Microsoft SQL Server, ao invés de usar um arquivo xml padrão. Para isso é necessário instalar os seguintes seoftwares:

  • mRemoteNG. LINK
  • Microsoft SQL Server (qualquer versão. No meu caso estou usando o MS SQL Server 2017 Express Edition) LINK
  • Instale também o Management Studio. LINK

Primeiramente instale o MS SQL Server e o Management Studio. Se você já tem um servidor remoto com MS SQL Server, pode pular essa parte.

No seu servidor onde o SQL Server está instalado, abra o Management Studio e crie um novo banco de dados denominado mRemoteNG.

Navegue em Security, clique com o botão direito em Logins e selecione new login.

  • Na guia “General”:
    • Em login name insira mRemoteNG
    • Selecione SQL Server authentication e insira um password para o usuário.
    • Em ‘default database’ selecione mRemoteNG.
  • Na guia “User Mapping”:
    • No painel “Users mapped to this login“, selecione e habilite o usuário “mRemoteNG”
    • Então, no painel inferior “Database role membership for: mRemoteNG“, selecione a opção “db_owner“.
    • Clique em “Ok“.

Se estiver usando o “SQL Server Express” com “SQL Server Authentication” é necessário também habilitar autenticação mista do SQL.

Para isso clique com o botão direito na instância e selecione “Propriedades”. Em seguida selecione “Security” e então “SQL Server and Windows Authentication Mode”.

Execute o seguinte código para configurar as tabelas necessárias na database:

if exists (select * from dbo.sysobjects
        where id = object_id(N'[dbo].[tblCons]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tblCons]
GO

if exists (select * from dbo.sysobjects
        where id = object_id(N'[dbo].[tblRoot]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tblRoot]
GO

if exists (select * from dbo.sysobjects
        where id = object_id(N'[dbo].[tblUpdate]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tblUpdate]
GO

CREATE TABLE [dbo].[tblCons] (
           [ID] int NOT NULL IDENTITY(1,1),
           [ConstantID] varchar(128) NOT NULL PRIMARY KEY,
           [PositionID] int NOT NULL,
           [ParentID] varchar(128),
           [LastChange] datetime NOT NULL,
           [Name] varchar(128) NOT NULL,
           [Type] varchar(32) NOT NULL,
           [Expanded] bit NOT NULL,
           [AutomaticResize] bit DEFAULT ((1)) NOT NULL,
           [CacheBitmaps] bit NOT NULL,
           [Colors] varchar(32) NOT NULL,
           [ConnectToConsole] bit NOT NULL,
           [Connected] bit NOT NULL,
           [Description] varchar(1024),
           [DisableCursorBlinking] bit NOT NULL,
           [DisableCursorShadow] bit NOT NULL,
           [DisableFullWindowDrag] bit NOT NULL,
           [DisableMenuAnimations] bit NOT NULL,
           [DisplayThemes] bit NOT NULL,
           [DisplayWallpaper] bit NOT NULL,
           [Domain] varchar(512),
           [EnableDesktopComposition] bit NOT NULL,
           [EnableFontSmoothing] bit NOT NULL,
           [ExtApp] varchar(256),
           [Favorite] tinyint NOT NULL,
           [Hostname] varchar(512),
           [ICAEncryptionStrength] varchar(32) NOT NULL,
           [Icon] varchar(128) NOT NULL,
           [LoadBalanceInfo] varchar(1024),
           [MacAddress] varchar(32),
           [Panel] varchar(128) NOT NULL,
           [Password] varchar(1024),
           [Port] int NOT NULL,
           [PostExtApp] varchar(256),
           [PreExtApp] varchar(256),
           [Protocol] varchar(32) NOT NULL,
           [PuttySession] varchar(128),
           [RDGatewayDomain] varchar(512),
           [RDGatewayHostname] varchar(512),
           [RDGatewayPassword] varchar(1024),
           [RDGatewayUsageMethod] varchar(32) NOT NULL,
           [RDGatewayUseConnectionCredentials] varchar(32) NOT NULL,
           [RDGatewayUsername] varchar(512),
           [RDPAlertIdleTimeout] bit NOT NULL,
           [RDPAuthenticationLevel] varchar(32) NOT NULL,
           [RDPMinutesToIdleTimeout] int NOT NULL,
           [RdpVersion] varchar(10),
           [RedirectAudioCapture] bit NOT NULL,
           [RedirectClipboard] bit DEFAULT ((0)) NOT NULL,
           [RedirectDiskDrives] bit NOT NULL,
           [RedirectKeys] bit NOT NULL,
           [RedirectPorts] bit NOT NULL,
           [RedirectPrinters] bit NOT NULL,
           [RedirectSmartCards] bit NOT NULL,
           [RedirectSound] varchar(64) NOT NULL,
           [RenderingEngine] varchar(10),
           [Resolution] varchar(32) NOT NULL,
           [SSHOptions] varchar(1024) NOT NULL,
           [SSHTunnelConnectionName] varchar(128) NOT NULL,
           [SoundQuality] varchar(20) NOT NULL,
           [UseCredSsp] bit NOT NULL,
           [UseEnhancedMode] bit DEFAULT ((0)),
           [UseVmId] bit,
           [UserField] varchar(256),
           [Username] varchar(512),
           [VNCAuthMode] varchar(10),
           [VNCColors] varchar(10),
           [VNCCompression] varchar(10),
           [VNCEncoding] varchar(20),
           [VNCProxyIP] varchar(128),
           [VNCProxyPassword] varchar(1024),
           [VNCProxyPort] int,
           [VNCProxyType] varchar(20),
           [VNCProxyUsername] varchar(512),
           [VNCSmartSizeMode] varchar(20),
           [VNCViewOnly] bit NOT NULL,
           [VmId] varchar(100),
           [InheritAutomaticResize] bit DEFAULT ((0)) NOT NULL,
           [InheritCacheBitmaps] bit NOT NULL,
           [InheritColors] bit NOT NULL,
           [InheritDescription] bit NOT NULL,
           [InheritDisableCursorBlinking] bit NOT NULL,
           [InheritDisableCursorShadow] bit NOT NULL,
           [InheritDisableFullWindowDrag] bit NOT NULL,
           [InheritDisableMenuAnimations] bit NOT NULL,
           [InheritDisplayThemes] bit NOT NULL,
           [InheritDisplayWallpaper] bit NOT NULL,
           [InheritDomain] bit NOT NULL,
           [InheritEnableDesktopComposition] bit NOT NULL,
           [InheritEnableFontSmoothing] bit NOT NULL,
           [InheritExtApp] bit NOT NULL,
           [InheritFavorite] bit NOT NULL,
           [InheritICAEncryptionStrength] bit NOT NULL,
           [InheritIcon] bit NOT NULL,
           [InheritLoadBalanceInfo] bit DEFAULT ((0)) NOT NULL,
           [InheritMacAddress] bit NOT NULL,
           [InheritPanel] bit NOT NULL,
           [InheritPassword] bit NOT NULL,
           [InheritPort] bit NOT NULL,
           [InheritPostExtApp] bit NOT NULL,
           [InheritPreExtApp] bit NOT NULL,
           [InheritProtocol] bit NOT NULL,
           [InheritPuttySession] bit NOT NULL,
           [InheritRDGatewayDomain] bit NOT NULL,
           [InheritRDGatewayHostname] bit NOT NULL,
           [InheritRDGatewayPassword] bit NOT NULL,
           [InheritRDGatewayUsageMethod] bit NOT NULL,
           [InheritRDGatewayUseConnectionCredentials] bit NOT NULL,
           [InheritRDGatewayUsername] bit NOT NULL,
           [InheritRDPAlertIdleTimeout] bit NOT NULL,
           [InheritRDPAuthenticationLevel] bit NOT NULL,
           [InheritRDPMinutesToIdleTimeout] bit NOT NULL,
           [InheritRdpVersion] bit DEFAULT ((0)) NOT NULL,
           [InheritRedirectAudioCapture] bit NOT NULL,
           [InheritRedirectClipboard] bit DEFAULT ((0)) NOT NULL,
           [InheritRedirectDiskDrives] bit NOT NULL,
           [InheritRedirectKeys] bit NOT NULL,
           [InheritRedirectPorts] bit NOT NULL,
           [InheritRedirectPrinters] bit NOT NULL,
           [InheritRedirectSmartCards] bit NOT NULL,
           [InheritRedirectSound] bit NOT NULL,
           [InheritRenderingEngine] bit NOT NULL,
           [InheritResolution] bit NOT NULL,
           [InheritSSHOptions] bit NOT NULL,
           [InheritSSHTunnelConnectionName] bit NOT NULL,
           [InheritSoundQuality] bit NOT NULL,
           [InheritUseConsoleSession] bit NOT NULL,
           [InheritUseCredSsp] bit NOT NULL,
           [InheritUseEnhancedMode] bit DEFAULT ((0)),
           [InheritUseVmId] bit,
           [InheritUserField] bit NOT NULL,
           [InheritUsername] bit NOT NULL,
           [InheritVNCAuthMode] bit NOT NULL,
           [InheritVNCColors] bit NOT NULL,
           [InheritVNCCompression] bit NOT NULL,
           [InheritVNCEncoding] bit NOT NULL,
           [InheritVNCProxyIP] bit NOT NULL,
           [InheritVNCProxyPassword] bit NOT NULL,
           [InheritVNCProxyPort] bit NOT NULL,
           [InheritVNCProxyType] bit NOT NULL,
           [InheritVNCProxyUsername] bit NOT NULL,
           [InheritVNCSmartSizeMode] bit NOT NULL,
           [InheritVNCViewOnly] bit NOT NULL,
           [InheritVmId] bit
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tblRoot] (
           [Name] [varchar] (2048) NOT NULL ,
           [Export] [bit] NOT NULL ,
           [Protected] [varchar] (4048) NOT NULL ,
           [ConfVersion] [float] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tblUpdate] (
           [LastUpdate] [datetime] NULL
) ON [PRIMARY]
GO

No mRemoteNG vá em Tools > Options.

Na tela “mRemoteNG Options” selecione “SQL Server” e habilite “Use SQL Server to load & save connections”.

Em hostname informe o hostname do servidor e o nome da instância (e.g.: MyComputer\SQLEXPRESS).

No meu caso tanto o SQL Server quanto o mRemoteNG estão instalados no mesmo computador, por isso estou usando um ponto ao invés do nome do computador.

Informe o nome da database e as credenciais de acesso que acabou de configurar e clique em “Test connection”

O Active Directory virou uma pedra no sapato da Microsoft?

O maior trunfo da Microsoft no mercado corporativo nos últimos vinte anos se tornou a sua pedra no sapato. Estou falando dele, o Active Directory.

Por muitos anos redes corporativas foram sustentadas por essa solução ubíqua e sem rival. Alguns, nostalgicamente poderão falar das maravilhas do Novel ou outros padrões dos anos 90, mas o fato é que o Active Directory reinou soberano no mundo corporativo desde que surgiu em meados dos anos 90 e é, por assim dizer, sinônimo de “rede” para muitos profissionais da área de TI. Afinal, quem nunca precisou mudar a senha do seu “usuario de rede”?

Resumidamente, o Active Directory é um banco de dados distribuído e organizado em domínios. Cada domínio contém objetos que representam diversos recursos de uma rede de computadores específica.

Através do Active Directory, administradores de sistemas podem fazer a gestão desses recursos de forma centralizada, limitando o acesso a recursos dessa rede apenas a quem pertence ao domínio ou definindo permissões para usuários ou computadores e, repito, tudo isso de forma centralizada

A facilidade de gerir a segurança através do Active Directory fez muitas empresas optarem por pagar mais caro no sistema operacional Windows ao invés de usar o bom e velho (e gratuito) Linux. O Linux, é preciso dizer, nunca foi capaz de se integrar adequadamente ao Active Directory, apesar do esforço de algumas distribuições em implementar essa funcionalidade. 

No entanto, o paradigma da computação em nuvem parece querer desestabilizar o reinado do Active Directory. 

Explico: nesses tempos líquidos, a criação e destruição de servidores virtuais numa nuvem pública ocorre numa velocidade vertiginosa. Servidores são lançados em auto scaling groups para atender a demanda por recursos em momentos específicos e destruídos tão logo não sejam mais necessários para diminuir custos. Uma aplicação web pode, facilmente, adicionar 20 novos servidores antes do café da manhã e excluir todos eles antes do almoço. 

Neste sentido, a velocidade em lançar um clone do servidor é fundamental para garantir a responsividade da aplicação. É evidente, portanto, que o tempo despendido para conectar esses servidores a um domínio é inútil e prejudicial para os negócios.

Alëm disso, esse cenário tende a aumentar o tempo de manutenção ou profilaxia do domínio –  sem falar dos custos com replicação e armazenamento dos dados do Active Directory relacionados com esses servidores “temporários” e que, a rigor, são totalmente desnecessários.

Você pode estar pensando: Oras, para isso basta não adicionar o servidor Windows ao domínio. 

Ao tirar o Active Directory da equação a responsabilidade pela segurança fica a cargo da própria aplicação, que agora precisa autenticar e autorizar usuários. Isso é feito através de padrões e ferramentas como certificados de segurança, tokens de autenticação ou provedores de identidade federados. E tudo isso é suportado tanto pelo Windows quanto por distribuições Linux.

O ponto é que, uma vez que o Active Directory na nuvem mais atrapalha do que ajuda, sua implementação não faz sentido. Mas, se não vou adicionar um servidor ao domínio, porque eu deveria pagar mais caro num sistema operacional que, agora, não trás nenhuma outra vantagem?

Além disso, na medida em que as aplicações usarem menos a autenticação do Windows (suportada por Active Directory) o uso de outras ferramentas da Microsoft passa a ser questionável: sem autenticação do Windows, qual a vantagem de pagar caro numa instalação do Microsoft SQL Server, se posso usar o MySQL gratuito e  – agora – tão seguro quanto? E se posso instalar o MySQL num servidor Linux com as mesmas vantagens (do ponto de vista de autenticação) que num Windows, porque deveria pagar pela licença do sistema operacional? 

Bom, esse é apenas um exercício de futurologia e, longe de mim querer decretar o fim do WIndows ou a morte da MIcrosoft. No entanto, considerando a empresa como um player relevante no mercado de computação em nuvem, penso que seu posicionamento com relação ao Active Directory na nuvem será determinante para o futuro da plataforma, da empresa e, até mesmo, da computação em nuvem.