domingo, 28 de junho de 2015

SharePoint 2013: Visão geral das vantagens, configurações e da manutenção do RBS com Filestream.

Visão Geral

No SharePoint, um objeto binário grande (BLOB) é um arquivo, tal como um documento ou um arquivo de vídeo. Por padrão, esses BLOBs, também chamados de dados não estruturados, são embutidos no banco de dados de conteúdo do SharePoint com os metadados ou dados estruturados. O tamanho dos BLOBs pode ser enorme: 2gb no SharePoint 2013, e a remoção dos BLOBs do banco de dados do SQL pode ser útil para melhorar o desempenho do servidor SQL.

Para isto podemos utilizar o RBS com Filestream, que é um recurso do SQL Server (a partir da versão 2008) que permite que dados estruturados sejam armazenados no banco de dados e que os dados associados não estruturados sejam armazenados diretamente no sistema de arquivos NTFS e mantenham a consistência transacional entre os dados estruturados e não estruturados, permitindo até mesmo a recuperação pontual dos dados FILESTREAM usando backups de log.


Seguindo os testes da Microsoft teremos o melhor ganho de desempenho com BLOBs maiores do que 1mb: Filestream usa o cache do sistema NT para dados de arquivo cache, reduzindo o efeito dos BLOBs no database engine. O pool de buffer do SQL Server não é utilizado, portanto, temos mais memória disponível para o processamento de consultas.
Outros efeitos positivos: 


  • Redução do tamanho das bases em torno de 95%
  • Melhoramento no desempenho do upload de arquivos em torno de 30% Maiores detalhes: SQL Server RBS Performance with SharePoint Server 2010



  • Configuração

    Observações:

    • A conta do usuário utilizada executando as etapas da configuração das bases deve ser membro do db_owner em cada banco de dados que você está configurando para RBS.
    • A conta do usuário que instala a biblioteca do cliente RBS deve ser membro do grupo de Administradores em todos os computadores em quais você instala a biblioteca do cliente do RBS.
    • A conta do usuário que habilita RBS para cada banco de dados de conteúdo do SharePoint deve ser administrador da farm do SharePoint.
    • Todas as configurações mencionadas nesse artigo foram testado em uma farm "three-tier" do SharePoint 2013 SP1 e com servidor SQL 2012 SP2.
    • O RBS com Filestream não influencia nos tamanhos recomendados pela Microsoft de 200GB e/ou 4TB.

    Habilitar Filestream na instância do SQL do SharePoint
    a.) Abra o SQL Server Configuration Manager.
    b.) Entre nas propriedades da instância no serviço do SQL e escolha FILESTREAM.
    c.) Habilite filestream na instância do SQL conforme imagem abaixo:


     
    d.) Execute a seguinte consulta para finalizar essa configuração:
    EXEC sp_configure filestream_access_level, 2RECONFIGURE


    e.) Reinicie a instância do SQL.
    Obs.: Essa configuração precisa ser feita uma única vez na instância do SQL em qual você utilizará RBS com Filestream.




    Provisionar o repositório BLOB para cada base de dados de conteúdo.


    Configurar o repositório da base

    Altere o nome da base e execute as consultas abaixo para cada base de dados de conteúdo.
    Obs.: Utilize uma chave de encriptação diferente (create master key encryption by password = N'Admin Key Password !2#4')!


    use [WSS_Content]if not exists(select * from sys.symmetric_keyswhere name = N'##MS_DatabaseMasterKey##')create master key encryption by password = N'Admin Key Password !2#4'
    use [WSS_Content]if not exists(select groupname from sysfilegroupswhere groupname=N'RBSFilestreamProvider')alter database [WSS_Content]add filegroup RBSFilestreamProvider contains filestream
    Obs.: Altere o lugar do repositório, conforme desejado.
    use [WSS_Content]alter database [WSS_Content]add file (name = RBSFilestreamFile, filename = 'c:\Blobstore')to filegroup RBSFilestreamProvider




    Instalar o cliente RBS em todos os servidores Web do SharePoint (em todos com o serviço "Microsoft SharePoint Foundation Web Application" habilitado).

    1. Baixe o cliente RBS (x64 RBS.msi) do Microsoft® SQL Server® 2012 SP2 Feature Pack.

    2. Execute no primeiro servidor do SharePoint o seguinte comando em um prompt administrativo:

    msiexec /qn /lvx* rbs_install_log.txt /i RBS.msi TRUSTSERVERCERTIFICATE=true FILEGROUP=PRIMARY DBNAME="WSS_Content" DBINSTANCE="DBInstanceName" FILESTREAMFILEGROUP=RBSFilestreamProvider FILESTREAMSTORENAME=FilestreamProvider_1


    Verifique em seguida o sucesso da instalação no log gerado (rbs_install_log.txt), você deve encontrar no final do log a mensagem do sucesso: "Product: Microsoft SQL Server 2012 Remote BLOB Store  -- Installation completed successfully."

    3. Execute o comando abaixo nos demais servidores web do SharePoint:
    msiexec /qn /lvx* rbs_install_log.txt /i RBS.msi DBNAME="WSS_Content_Intranet" DBINSTANCE="mvplabsql" ADDLOCAL=Client,Docs,Maintainer,ServerScript,FilestreamClient,FilestreamServer


    Verifique em seguida o sucesso da instalação no log gerado (rbs_install_log.txt), você deve encontrar no final do log a mensagem do sucesso: "Product: Microsoft SQL Server 2012 Remote BLOB Store  -- Installation completed successfully."

    4. Ative RBS nas bases de conteúdo do SharePoint.

    Execute o script abaixo no Powershell do SharePoint:
    $cdb = Get-SPContentDatabase <ContentDatabaseName>
    $rbss = $cdb.RemoteBlobStorageSettings
    $rbss.Installed()
    $rbss.Enable()
    $rbss.SetActiveProviderName($rbss.GetProviderNames()[0])
    $rbss


    O conteúdo existente pode ser migrado acrescendo a linha $rbs.Migrate().

    A configuração está funcional a partir desse momento - você pode salvar arquivos dentro do SharePoint e monitorar o crescimento imediato do tamanho da pasta configurada: No caso da minha configuração c:\Blobstore.







    Manutenção do RBS com Filestream


    Uma parte ainda não está funcional: Os BLOBs não são excluídos automaticamente do repositório do RBS quando o conteúdo correspondente é excluído do SharePoint. Um ciclo de coleta de lixo usando o Maintainer do RBS é necessário para limpar os BLOBs órfãos.
    Observação: O Maintainer não precisa ser executado no servidor SQL e pode ser executado a partir do qualquer servidor do SharePoint com o client instalado (Seção "Instalar o cliente RBS em todos os servidores Web do SharePoint" desse artigo).


    Configurar o Maintainer do RBS




    1. Verifique a configuração em vigor no arquivo da configuração da conexão com os seguintes comandos:
    cd C:\Program Files\Microsoft SQL Remote Blob Storage 11.0\Maintainer
    rename Microsoft.Data.SqlRemoteBlobs.Maintainer.exe.config web.config
    c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pdf connectionStrings .
    Você deve encontrar as mesmas configurações feitas na instalação do cliente:
    <connectionStrings>
    <add name="RBSMaintainerConnection" connectionString="Data Source=SQLSERVER;Initial Catalog=CONTENTDATABASE;Integrated Security=True;Application Name=&quot;Remote Blob Storage Maintainer&quot;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    2. Em seguida encripte a configuração da conexão novamente:
    c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pef connectionStrings . -prov DataProtectionConfigurationProvider
    rename web.config Microsoft.Data.SqlRemoteBlobs.Maintainer.exe.config
    3. Configure uma tarefa agendada para ser executada, por exemplo mensalmente, no servidor responsável pela manutenção do RBS com Filestream.
    Nas configurações da tarefa, na caixa Programa/script, navegue para o arquivo binário do Maintainer >C:\Program Files\Microsoft SQL Remote Blob Storage 11.0\Maintainer\Microsoft.Data.SqlRemoteBlobs.Maintainer.exe e insira na caixa de texto os seguintes parâmetros:
    <-ConnectionStringName RBSMaintainerConnection> <-Operation GarbageCollection ConsistencyCheck ConsistencyCheckForStores>
    <-GarbageCollectionPhases rdo>
    <-ConsistencyCheckMode r>
    <-TimeLimit 120>

    Verificação da limpeza dos órfãos
    A limpeza dos órfãos deve estar ativa após a configuração anterior e pode ser testada. Para isto precisamos estar ciente do ciclo de vida dos BLOBs, que é diferente dependendo do modo da recuperação da base de dados do conteúdo do SharePoint:
    No modo simples: Após a execução do Maintainer e um backup completo.
    No modo full: Após a execução do Maintainer e de dois backups dos logs e dois checkpoints manuais (backup, checkpoint, backup, checkpoint)

    Você poderá testar a limpeza apagando arquivos (inclusive do segundo estágio) com os seguintes passos:

    1. Altere o período da limpeza para 0 com a seguinte consulta:
    exec mssqlrbs.rbs_sp_set_config_value 'garbage_collection_time_window', 'time 00:00:00';
    exec mssqlrbs.rbs_sp_set_config_value 'delete_scan_period', 'time 00:00:00';
    exec mssqlrbs.rbs_sp_set_config_value 'orphan_scan_period', 'time 00:00:00';
    Observação: Execute a consulta abaixo para reverter essa configuração após os testes.
    exec mssqlrbs.rbs_sp_set_config_value 'garbage_collection_time_window', 'days 30';
    exec mssqlrbs.rbs_sp_set_config_value 'delete_scan_period', 'days 30';
    exec mssqlrbs.rbs_sp_set_config_value 'orphan_scan_period', 'days 30';
    2. Execute em seguida o seguinte comando no servidor responsável pela manutenção.
    "C:\Program Files\Microsoft SQL Remote Blob Storage 11.0\Maintainer\Microsoft.Data.SqlRemoteBlobs.Maintainer.exe" -ConnectionStringName RBSMaintainerConnection -Operation GarbageCollection ConsistencyCheck -GarbageCollectionPhases rdo -ConsistencyCheckMode r 
    O resultado deve ter essa aparência, importante nesse caso é a linha “Scanned 98 blobs. Deleted 98 blobs in the range of […]”
    Starting Maintainer tasks.
        Starting Garbage Collection.
            Starting Reference Scan.
                Reference Scan is complete for this database.
                Scanned 98 blobs. Deleted 98 blobs in the range of 0x000000000000000
    000000000(exclusive) to 0x000000000000006200000001(inclusive).
            This task has ended. Processed 1 work units total. 0 Work units were incomplete.
            Starting Delete Propagation.
                Starting Delete Propagation for pool <PoolId 1, BlobStoreId 1, Store PoolId 0x01000000>.
                    ..
                    This pool does not have to be deleted. Reason: PoolCanStoreNewBlobs.
                Delete Propagation complete for pool <PoolId 1, BlobStoreId 1, Store
    PoolId 0x01000000>.
                98 Delete for 98 blobs attempted, 98 blobs were deleted. 0 blobs were not found in the blob store. For more information, see the RBS Maintainer log.
                Delete Propagation is complete for this database.
            This task has ended. Processed 1 work units total. 0 Work units were incomplete. Needed to delete 98 blobs. Succeeded in deleting 98 blobs, 0 blobs were not found in the blob store.
            Starting Orphan Cleanup.
                Starting Orphan Cleanup for pool <PoolId 1, BlobStoreId 1, StorePool Id 0x01000000>.
                    .
                Enumerated 0 blobs, 0 blobs are being considered for orphan cleanup.
                    .
                Orphan Cleanup complete for pool <PoolId 1, BlobStoreId 1, StorePool Id 0x01000000>.
                0 Delete for 0 blobs attempted, 0 blobs were deleted. 0 blobs were not found in the blob store. For more information, see the RBS Maintainer log.
                Orphan Cleanup is complete for this database.
            This task has ended. Processed 1 work units total. 0 Work units were incomplete. Needed to delete 0 blobs. Succeeded in deleting 0 blobs, 0 blobs were not found in the blob store. Enumerated 0 blobs, 0 blobs are being considered for orphan cleanup.
        This task has ended.
        Starting RBS consistency check with attempt to repair.
            No RBS consistency issues found.
        Consistency check completed.
    This task has ended.
    3. Execute o(s) backup(s) necessários, conforme mencionado anteriormente.
     


    Backup e restaurar dados

    O backup e restaurar dados, tanto no servidor SQL como no SharePoint, continua a funcionar da mesma forma com algumas pequenas alterações:

    • SQL Filestream não suporta Snapshots, portanto não podemos utilizar o parâmetro -UseSqlSnapshot na execução do backup pelo comando Backup-SPSite.
    • É recomendável a utilização do comando Backup-SPSite e Restore-SPSite para trazer um site collection em um web application com Filestream habilitado para um outro web application ou uma outra farm, sem Filestream para evitar problemas.
    • No backup dos web applications vai ocorrer o seguinte evento no log: "Warning: [WSS_Content] A Remote Blob Storage provider is configured for this content database. To successfully recover your data on database restore, you may need to follow additional steps as indicated by your Remote Blob Storage provider." que pode ser desconsiderado nessa configuração.


    Fontes:

    Overview of RBS in SharePoint 2013
    https://technet.microsoft.com/en-us/library/ee748649.aspx

    Deciding to use RBS in SharePoint 2013
    https://technet.microsoft.com/en-us/library/ff628583.aspx

    Install and configure RBS with FILESTREAM in a SharePoint 2013 farm 
    https://technet.microsoft.com/en-us/library/ee748631.aspx

    Habilitar e configurar FILESTREAM
    https://msdn.microsoft.com/library/cc645923.aspx

    View, restore, or delete items in the Recycle Bin of a SharePoint site
    https://support.office.com/en-sg/article/View-restore-or-delete-items-in-the-Recycle-Bin-of-a-SharePoint-site-6df466b6-55f2-4898-8d6e-c0dff851a0be

    Maintaining Remote BLOB Store
    https://technet.microsoft.com/en-us/library/gg316773(v=sql.105).aspx

    ASP.NET IIS Registration Tool (Aspnet_regiis.exe)
    https://msdn.microsoft.com/en-us/library/k6h9cz8h(v=vs.140).aspx

    Whitepaper Armazenamento de Filestream
    http://download.microsoft.com/download/6/1/D/61D13F7E-76D9-4D0F-A1B9-39B66F47DDEB/FILESTREAMStorage.docx

    Database Checkpoints (SQL Server)
    https://msdn.microsoft.com/en-us/library/ms189573.aspx

    Software boundaries and limits for SharePoint 2013
    https://technet.microsoft.com/en-us/library/cc262787.aspx

    Restore content databases in SharePoint 2013
    https://technet.microsoft.com/en-us/library/ee748604.aspx

    Migrar conteúdo para e do RBS no SharePoint 2013

    https://technet.microsoft.com/pt-br/library/ff628254.aspx

    terça-feira, 2 de junho de 2015

    SharePoint: Boas práticas na implementação do protocolo HTTPS


    O planejamento de suporte de navegadores é importante na implementação do SharePoint, principalmente para páginas públicas. Uma parte importantíssima dessa implementação é a encriptação por meio de certificados digitais para garantir aos visitantes, usuários e clientes uma troca segura de informações, sem riscos dos dados trafegados serem interceptados ou alterados por terceiros.



    O SharePoint suporta atualmente, com algumas pequenas limitações, todos os navegadores principais como Chrome, Internet Explorer, Firefox, Safari e dispositivos móveis. Aparentemente todos os navegadores suportam a utilização do protocolo de comunicação HTTPS, porém existem particularidades no uso dos protocolos de encriptação. 




    O Firefox, por exemplo, suporta, mas não aceita por padrão os protocolos de encriptação SSL (1.0, 2.0 e 3.0) e TLS (1.0 e 1.1). O único protocolo de fato aceito pelo navegador é o TLS 1.2, conforme a seguinte imagem (Firefox na versão 38):



    Firefox: About:Config - TLS Fallback desabilitado


    O conhecimento desse detalhe é importante porque o TLS na versão 1.2 não é habilitado por padrão em todas as versões do servidor Windows e também existem proxies reversos que não suportam o TLS 1.2.




    A abertura das páginas com TLS 1.2 não habilitado ou não suportado na infraestrutura pelo Firefox gera a mensagem "Secure Connection Failed: The Connection to the server was reset while the page was loading". 



    "Secure Connection Failed: The Connection to the server was reset while the page was loading"



    Isto é uma situação complicada para uma página web, já que o Firefox é um dos navegadores mais populares:

    Fonte Wikipedia: Fatia de uso de navigadores.


    Veremos agora em detalhe o que acontece na negociação do protocolo de encriptação entre cliente e servidor.



    1.   O cliente encaminha um "CLIENT HELLO" para o servidor no IP e a porta obtidos durante o handshake:

    struct {
              ProtocolVersion client_version;
              Random random;
              SessionID session_id;
              CipherSuite cipher_suites<2..2^16-1>;
              CompressionMethod compression_methods<1..2^8-1>;
              Extension client_hello_extension_list<0..2^16-1>;
          } ClientHello;


    Um exemplo do "Client Hello", requisitando o 
    protocolo TLS 1.2, capturado pela ferramenta Fiddler:

    CONNECT URL:443 HTTP/1.1
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0
    Proxy-Connection: keep-alive
    Connection: keep-alive
    Host: URL:443

    A SSLv3-compatible ClientHello handshake was found. Fiddler extracted the parameters below.

    Version: 3.3 (TLS/1.2)
    Random: E8 DA B9 55 D0 3E 7D 3E 48 86 89 EA CF 59 3E AB 60 D3 B0 F4 E1 37 C4 50 D5 E7 69 56 7B 89 B4 CA
    "Time": 30/07/2015 05:06:00
    SessionID: empty
    Extensions:
                server_name            NAME
                renegotiation_info  00
                elliptic_curves          secp256r1 [0x17], secp384r1 [0x18], secp521r1 [0x19]
                ec_point_formats    uncompressed [0x0]
                SessionTicket          empty
                NextProtocolNego   empty
                ALPN             h2-16, h2-15, h2-14, h2, spdy/3.1, http/1.1
                status_request         OCSP - Implicit Responder
                signature_algs         sha256_rsa, sha384_rsa, sha1_rsa, sha256_ecdsa, sha384_ecdsa, sha1_ecdsa, sha256_dsa, sha1_dsa
    Ciphers:
                [C02B]           TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
                [C02F]            TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
                [C00A]           TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
                [C009]            TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
                [C013]            TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
                [C014]            TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
                [0033] TLS_DHE_RSA_WITH_AES_128_SHA
                [0039] TLS_DHE_RSA_WITH_AES_256_SHA
                [002F] TLS_RSA_AES_128_SHA
                [0035] TLS_RSA_AES_256_SHA
                [000A]            SSL_RSA_WITH_3DES_EDE_SHA

    2.   Vou considerar o IIS com a entidade SERVER para este cenário. Ao receber o "CLIENT HELLO", o servidor tem acesso às seguintes informações: 
    ·           Endereço IP
    ·           Número da porta (443)
    ·           A versão do protocolo solicitado, por exemplo TLS 1.2
    ·           A lista dos "Cipher Suites"
    ·           O ID da sessão etc.

    O servidor irá agora tentar determinar se há um ponto de extremidade (end point) com o IP e a porta. No caso do IIS o driver TCPIP.SYS move o pacote para a camada HTTP.SYS se a página solicitada existe.

    3.   O servidor responderá ao cliente com “SERVER HELLO” definido no protocolo mencionado no passo anterior (RFC 3546), se as informações recebidas forem corretas.

    struct {
              ProtocolVersion server_version;
              Random random;
              SessionID session_id;
              CipherSuite cipher_suite;
              CompressionMethod compression_method;
              Extension server_hello_extension_list<0..2^16-1>;

          } ServerHello;



    Os antecessores do TLS, SSL, não garantem mais a segurança prometida: A Google descobriu na última versão 3.0 do SSL a vulnerabilidade "Poodle" e partir desses fatos podemos derivar a boa prática de desabilitar todos os protocolos do SSL e a utilização do TLS como obrigação.

    Segue um script de exemplo para habilitar TLS 1.2 no servidor Windows na versão 2008 R2:

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2"
    md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server"
    md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client"
    new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "Enabled" -value 1 -PropertyType "DWord"
    new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "DisabledByDefault" -value 0 -PropertyType "DWord"
    new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "Enabled" -value 1 -PropertyType "DWord"
    new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "DisabledByDefault" -value 0 -PropertyType "DWord"

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    A empresa Qualys oferece um serviço online gratuito para avaliar a página:


    Fontes:

    Transport Layer Security

    Support for SSL/TLS protocols on Windows

    Cipher Suites in Schannel

    Cipher suite

    Como restringir o uso de determinados algoritmos criptográficos e protocolos no Schannel.dll

    TLS/SSL support history of web browsers

    Web Browser