Um servidor de e-mail do OpenBSD usando OpenSMTPD, Dovecot, Rspamd e RainLoop

Introdução

Este tutorial demonstra um servidor de email com todos os recursos em execução no OpenBSD usando OpenSMTPD, Dovecot, Rspamd e RainLoop. O OpenSMTPD é o servidor de correio padrão do OpenBSD. Escolha uma instância do Vultr Compute Cloud com bastante armazenamento para o número esperado de usuários.

Etapas preliminares

Configure sua conta de usuário para executar tarefas como raiz.

su -
usermod -G wheel <username>
echo "permit nopass keepenv :wheel" > /etc/doas.conf
exit

Configure o repositório de pacotes para o OpenBSD.

doas su
echo "https://cdn.openbsd.org/pub/OpenBSD" > /etc/installurl
exit

Adicione os pacotes necessários.

doas pkg_add opensmtpd-extras opensmtpd-filter-rspamd dovecot dovecot-pigeonhole rspamd redis

Configurar o OpenSMTPD

Por padrão, o OpenSMTPD escuta apenas no host local. Ele deve ser configurado explicitamente para escutar nas interfaces externas. Ele deve ser configurado para usar usuários virtuais em vez de usuários do sistema por segurança.

Faça backup do /etc/smtpd.confarquivo padrão e crie um novo a partir do zero.

cd /etc/mail
mv smtpd.conf smtpd.conf.default

Crie um novo smtpd.confcomo mostrado abaixo. Substitua example.compelo seu domínio. Essa configuração inicial não ativa o filtro rspamd ao testar o OpenSMTP. O filtro de spam será ativado mais tarde.

pki "mail" cert "/etc/ssl/mail.crt"
pki "mail" key "/etc/ssl/private/mail.key"

table aliases file:/etc/mail/aliases
table credentials passwd:/etc/mail/credentials
table virtuals file:/etc/mail/virtuals

filter "rspamd" proc-exec "/usr/local/libexec/smtpd/filter-rspamd"

# To accept external mail, replace with: listen on all

# listen on all tls pki "mail" hostname "mail.example.com"
listen on egress port submission tls-require pki "mail" hostname "mail.example.com" \
  auth <credentials>

action "local_mail" mbox alias <aliases>
action "domain_mail" maildir "/var/vmail/example.com/%{dest.user}" \
  virtual <virtuals>
action "outbound" relay

# Uncomment the following to accept external mail for domain "example.org"

# match from any for domain "example.com" action "domain_mail"
match from local for local action "local_mail"

match from local for any action "outbound"
match auth from any for any action "outbound"

Crie o arquivo / etc / credentials

O OpenSMTPD e o Dovecot podem compartilhar um banco de dados de autenticação. Esse banco de dados é semelhante ao arquivo de senha do sistema em formato, com dois campos extras para o Dovecot. Os dois campos especiais definem o diretório inicial virtual e o local do email. As senhas estão no formato blowfish. Este tutorial cria três exemplos de usuários.

Gere as senhas e concatene-as no /etc/mail/credentialsarquivo.

doas su
smtpctl encrypt example_password1 >> /etc/mail/credentials
smtpctl encrypt example_password2 >> /etc/mail/credentials
smtpctl encrypt example_password3 >> /etc/mail/credentials
exit

A saída é semelhante a esta:

$2b$10$agmNBPvFm1zqCjbbZC3JbO4Ns2jJNZQfTS45MAnKi.IPrkKITyTa6
$2b$10$LwkcKVVnwG8hDxu2W4YKD.K0kQ2oylOmQ9SBUb0hIopBsmNxYPb4e
$2b$10$bgLW/GMZyRXKbROgRQIvRu4xbeOqOJJXlgEAKuS5sIrBvfdPvEzeq

Edite /etc/mail/credentialspara adicionar os campos obrigatórios. Cada linha é mapeada para uma conta do sistema, vmail , com UID e GID de 2000 . Substitua example.com pelo seu domínio. O nome do usuário virtual é o endereço de email completo.

[email protected]:$2b$10$agmNBPvFm1zqCjbbZC3JbO4Ns2jJNZQfTS45MAnKi.IPrkKITyTa6:vmail:2000:2000:/var/vmail/example.com/john::userdb_mail=maildir:/var/vmail/example.com/john
[email protected]:$2b$10$LwkcKVVnwG8hDxu2W4YKD.K0kQ2oylOmQ9SBUb0hIopBsmNxYPb4e:vmail:2000:2000:/var/vmail/example.com/adam::userdb_mail=maildir:/var/vmail/example.com/adam
[email protected]:$2b$10$bgLW/GMZyRXKbROgRQIvRu4xbeOqOJJXlgEAKuS5sIrBvfdPvEzeq:vmail:2000:2000:/var/vmail/example.com/natalie::userdb_mail=maildir:/var/vmail/example.com/natalie

Criar conta de correio virtual e definir segurança

  • Defina /etc/mail/credentialspermissões como somente leitura para _smtpde _dovecotusuários do sistema.
  • Crie o vmailusuário, o grupo e o diretório inicial do sistema.

    • Ao criar o usuário do sistema vmail, receberá o seguinte aviso: useradd: Warning: home directory '/var/vmail' doesn't exist, and -m was not specified. Isso é esperado. Isso evita sobrecarregar o diretório com arquivos de ponto de /etc/skel. Eles não são necessários porque a conta do vmail não permite o login.

      doas chmod 0440 / etc / mail / credenciais doas chown smtpd: dovecot / etc / mail / credentials doas useradd -c "Conta de correio virtual" -d / var / vmail -s / sbin nologin -u 2000 -g = uid -L staff vmail doas mkdir / var / vmail doas chown vmail: vmail / var / vmail

Criar o mapeamento de usuário virtual

Crie /etc/mail/virtualspara definir os endereços de email válidos.

Criar chaves públicas / privadas para o OpenSMTPD

Este exemplo usa um certificado autoassinado. Use um certificado assinado válido se você tiver um. Quando o nome comum for solicitado, verifique se ele corresponde ao FQDN do servidor. Este exemplo usa mail.example.com.

doas su
cd /etc/ssl
openssl genrsa -out private/mail.key 4096
openssl req -x509 -new -nodes -key private/mail.key -out mail.crt -days 3650 -sha256
chmod 0400 /etc/ssl/private/mail.key
exit

Teste o servidor

Use o verificador de sintaxe de configuração do OpenSMTPD. Se nenhum problema for encontrado, reinicie o daemon smtpd.

doas smtpd -n
doas rcctl restart smtpd

Em uma conta de email externa, envie um email de teste para um dos usuários.

  • O OpenSMTPD criará a estrutura da pasta maildir abaixo /var/vmaile enviará o email para /var/vmail/example.com/<username>/new.
  • Como o usuário root, navegue até este local e comprovem que você tem um arquivo chamado semelhante a este: 1576339842.4d64757b.example.com:2,.
  • Revise o conteúdo do arquivo, incluindo todos os cabeçalhos de email, para verificar se a entrega de email funciona corretamente.

    Return-Path: <n0244e80da3-54b1ed125c5342fc-adam===example.org@bounce.example.org>
    Delivered-To: [email protected]
    Received: from spruce-goose-ba.twitter.com (spruce-goose-ba.twitter.com [199.59.150.96])
        by mail.example.com (OpenSMTPD) with ESMTPS id 75b514d3 (TLSv1.2:ECDHE-RSA-AES256-GCM-    SHA384:256:NO)
        for <[email protected]>;
        Sat, 14 Dec 2019 11:10:40 -0500 (EST)
    DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=twitter.com;
        s=dkim-201406; t=1576339839;
        bh=jhKB5/w9v87GaXSuizT576ntJ/72gvLRDhsqmGQQrCE=;
        h=Date:From:To:Subject:MIME-Version:Content-Type:List-Unsubscribe:
        Message-ID;
        b=TWn/QVUJ1VDlWiweWoanwHLABCL1nqmm0+TBzh3PjmYNm0quRMXB7QL2ykzHGME5A
        DTz/JFHa0cOvQsrdhxxbjOLFKimK0nF+Ou5kI+2HzTzfVNZS0qGnTVP/tZyaIsWjjl
        an5EiR6HFOHG4iClOOEOJW4oLDEZfPTefrlW+378bmHGIRUNDvVKrbXKunL9fJFAb3
        JSrhWQNwbrF/aARFzw4nKfb1I7vTRSrN1eXE5JxzGwI2XAjqDIWdR5ExwUNbJH5ZPs
        wQ85j8KLZEEgQkbH9CypgeUMJWsVK95FqOCCaqKMS10M7intGMb3aeiiFcB7yDHi9t
        u7rVESm4eGp/g==
    X-MSFBL: DM7pSZns+YDRgNEmGNre9aPjZTtc1tDlN97w5rQDBts=|eyJ1IjoibWF0dEBnb2J
        sYWNrY2F0LmNvbUBpaWQjIzU0YjFlZDEyNWM1MzQyZmNiNThiMzVmNzI0NDZlMGF
        mQHVzYiMjNkAyNDRAMTA4MjgwNTAxMDYzNzk1MDk3NkAwQDA4MjY5ZWI4OTI3YzR
        kNTFiNTZkMjY3YzY2OGRmN2IwY2Y4M2ExZGIiLCJyIjoibWF0dEBnb2JsYWNrY2F
        0LmNvbSIsImciOiJCdWxrIiwiYiI6InNtZjEtYmd4LTM0LXNyMS1CdWxrLjE4NiJ
        9
    Date: Sat, 14 Dec 2019 16:10:39 +0000
    ...
    

Configurar IMAP Dovecot

Defina a classe de logon

Dovecot requer a capacidade de ter um número maior de arquivos abertos para leitura e gravação do que a classe padrão permite. Não fazer isso causará erros difíceis de solucionar.

Defina uma classe de logon para o daemon Dovecot. Na parte inferior, /etc/login.confadicione as seguintes linhas.

    dovecot:\
        :openfiles-cur=1024:\
        :openfiles-max=2048:\
        :tc=daemon:    

Criar o arquivo de configuração Dovecot

Crie /etc/dovecot/local.conf.

auth_mechanisms = plain
first_valid_uid = 2000
first_valid_gid = 2000
mail_location = maildir:/var/vmail/%d/%n
mail_plugin_dir = /usr/local/lib/dovecot
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex  imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext imapsieve vnd.dovecot.imapsieve
mbox_write_locks = fcntl
mmap_disable = yes
namespace inbox {
  inbox = yes
  location =
  mailbox Archive {
  auto = subscribe
  special_use = \Archive
  }
  mailbox Drafts {
  auto = subscribe
  special_use = \Drafts
  }
  mailbox Junk {
  auto = subscribe
  special_use = \Junk
  }
  mailbox Sent {
  auto = subscribe
  special_use = \Sent
  }
  mailbox Trash {
  auto = subscribe
  special_use = \Trash
  }
  prefix =
}
passdb {
  args = scheme=CRYPT username_format=%u /etc/mail/credentials
  driver = passwd-file
  name =
}
plugin {
  imapsieve_mailbox1_before = file:/usr/local/lib/dovecot/sieve/report-spam.sieve
  imapsieve_mailbox1_causes = COPY
  imapsieve_mailbox1_name = Junk
  imapsieve_mailbox2_before = file:/usr/local/lib/dovecot/sieve/report-ham.sieve
  imapsieve_mailbox2_causes = COPY
  imapsieve_mailbox2_from = Junk
  imapsieve_mailbox2_name = *
  sieve = file:~/sieve;active=~/.dovecot.sieve
  sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
  sieve_pipe_bin_dir = /usr/local/lib/dovecot/sieve
  sieve_plugins = sieve_imapsieve sieve_extprograms
}
protocols = imap sieve
service imap-login {
  inet_listener imaps {
  port = 0
  }
}
service managesieve-login {
  inet_listener sieve {
  port = 4190
  }
  inet_listener sieve_deprecated {
  port = 2000
  }
}
ssl_cert = </etc/ssl/mail.crt
ssl_key = </etc/ssl/private/mail.key
userdb {
  args = username_format=%u /etc/mail/credentials
  driver = passwd-file
  name =
}
protocol imap {
  mail_plugins = " imap_sieve"
}

Dovecot Bug Fix

Há um bug no Dovecot em que as configurações ssl_certe ssl_keynão são substituídas no local.confarquivo, por isso precisamos comentá-las. Se você perder esta etapa, o Dovecot falhará ao iniciar corretamente.

Edite /etc/dovecot/conf.d/10-ssl.confcomo mostrado.

...
# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
#ssl_cert = </etc/ssl/dovecotcert.pem
#ssl_key = </etc/ssl/private/dovecot.pem
...

Crie os scripts de peneira

Os scripts de peneira treinam o Rspamd em spam e presunto . Mover e-mail para dentro e para fora da pasta de lixo eletrônico aciona um evento para treinar Rspamd.

Esses arquivos estão localizados em /usr/local/lib/dovecot/sieve.

Crie o report-ham.sievearquivo

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.mailbox" "*" {
  set "mailbox" "${1}";
}

if string "${mailbox}" "Trash" {
  stop;
}

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "sa-learn-ham.sh" [ "${username}" ];

Crie o report-spam.sievearquivo

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "sa-learn-spam.sh" [ "${username}" ];

Compile os arquivos.

sievec report-ham.sieve
sievec report-spam.sieve 

Crie os dois scripts de shell a seguir em /usr/local/lib/dovecot/sieve

Adicione o seguinte a sa-learn-ham.sh

#!/bin/sh
exec /usr/local/bin/rspamc -d "${1}" learn_ham

Adicione o seguinte a sa-learn-spam.sh

#!/bin/sh
exec /usr/local/bin/rspamc -d "${1}" learn_spam

Torne os arquivos executáveis.

chmod 0755 sa-learn-ham.sh
chmod 0755 sa-learn-spam.sh

Ative e inicie o Dovecot.

rcctl enable dovecot
rcctl start dovecot

Verifique se o Dovecot começou corretamente.

ps ax | grep dovecot

88005 ??  I        0:00.11 /usr/local/sbin/dovecot
69640 ??  I        0:00.03 dovecot/anvil
91207 ??  I        0:00.03 dovecot/log
98178 ??  I        0:00.19 dovecot/config
34712 ??  I        0:00.06 dovecot/stats
96674 ??  I        0:00.03 dovecot/imap-login
 8891 ??  S        0:00.02 dovecot/imap

Verifique se o Dovecot pode ler corretamente /etc/mail/credentials

doveadm user [email protected]

field    value
uid      2000
gid      2000
home /var/vmail/example.com/john
mail maildir:/var/vmail/example.com/john

Verifique se um usuário de email pode efetuar login.

doveadm auth login [email protected]

Password: ********
passdb: [email protected] auth succeeded
extra fields:
  [email protected]

userdb extra fields:
  [email protected]
  mail=maildir:/var/vmail/example.com/john
  uid=2000
  gid=2000
  home=/var/vmail/example.com/john
  auth_mech=PLAIN

Configurar Rspamd

Esta é uma configuração básica do Rspamd, consulte a documentação oficial para obter mais detalhes. Este exemplo cria uma definição para o nosso domínio para habilitar a assinatura DKIM.

Crie um par de chaves público / privado /etc/mail/dkime defina as permissões corretas.

doas su
mkdir /etc/mail/dkim
cd /etc/mail/dkim
openssl genrsa -out private.key 1024
openssl rsa -in private.key -pubout -out public.key
chmod 0440 private.key
chown root:_rspamd private.key

Crie um registro DNS para DKIM contendo a chave pública. Consulte o seu provedor de DNS para obter detalhes sobre como criar um registro DKIM. Copie o conteúdo /etc/mail/dkim/public.keye cole-o após a p=parte do registro DKIM, como mostrado abaixo. Observe que este exemplo também cria um registro SPF.

default._domainkey.example.com. IN TXT "v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClcuK3FV3Ug64li8iFsuJ2ykgb7FMZsujk9uG79ppPUp57vCfjzO7F+HBfx5qIwvlGxv2IJXK86FZwhpUX+HFCDUtfB2z0ZNGerWcZfNzM1w1Bru/fdMd2tCYkiHEa5RWIkLfs/Fm+neXxRZfAG2UDWmAghNbgzYv7xViwgufDIQIDAQAB"
example.com. IN TXT "v=spf1 a ip4:192.0.2.1 mx ~all"

Crie um registro DMARC.

_dmarc.example.com. IN TXT "v=DMARC1;p=none;pct=100;rua=mailto:[email protected]"

Crie o /etc/rspamd/local.d/dkim_signing.confarquivo de configuração.

  • A selector="default";linha é derivada da primeira parte do registro DNS DKIM ( default._domainkey....) criado acima.

    domain {
        example.com {
            path = "/etc/mail/dkim/example.com.key";
            selector = "default";
        }
    }
    

Ative e inicie o Rspamd.

doas rcctl enable redis rspamd
doas rcctl start redis rspamd

Altere as linhas abaixo /etc/mail/smtpd.confe reinicie o OpenSMTPD para ativar o Rspamd.

...
listen on all tls pki "mail" hostname "mail.example.com" filter "rspamd"
listen on egress port submission tls-require pki "mail" hostname "mail.example.com" \
  auth <credentials> filter "rspamd"
...
rcctl restart smtpd

Teste o servidor de email com o cliente de email POP3 ou IMAP. Se você não precisar de webmail, pare aqui.

(Opcional) Configurar o RainLoop Webmail

Instalar pacotes de pré-requisitos

Quando solicitado, escolha a versão mais atual do PHP.

pkg_add php php-curl php-pdo_sqlite php-zip pecl73-mcrypt zip unzip wget curl

Pegue o tarball do webmail RainLoop e extraia-o para /var/www/htdocs/.

Use a Standard Edition, que inclui um atualizador automático.

cd /tmp
wget https://www.rainloop.net/repository/webmail/rainloop-latest.zip
unzip rainloop-latest.zip -d /var/www/htdocs/rainloop
chown -R www:www /var/www/htdocs

Criar Vamos criptografar o certificado SSL

  • Copiar /etc/examples/acme-client.confpara/etc
  • Adicione as seguintes linhas na parte inferior do arquivo:

    domain webmail.example.com {
    domain key "/etc/ssl/private/webmail.example.com.key"
    domain full chain certificate "/etc/ssl/webmail.example.com.crt"
    sign with letsencrypt
    }
    

Configurar httpd

  • Crie uma entrada DNS (registro CNAME ou A) para o subdomínio webmail.example.com
  • Edite /etc/httpd.confseguindo o exemplo abaixo.

    prefork 3
    types { include "/usr/share/misc/mime.types" }
    
    server "default" {
        listen on egress port 80 
        root "/htdocs"
        directory index index.html
    
        location "/.well-known/acme-challenge/*" {
                root "/acme"
                request strip 2
        }
    }
    

Execute a verificação da sintaxe httpd.

httpd -n

Ative e inicie o httpd.

rcctl enable httpd
rcctl start httpd

Solicite o certificado Let's Encrypt.

acme-client -v webmail.example.com

Adicione as definições de servidor do RainLoop ao /etc/httpd.conf

server "webmail.example.com" {
    listen on egress port 80
    block return 302 "https://$SERVER_NAME$REQUEST_URI"
}

server "webmail.example.com" {
    listen on egress tls port 443
    root "/htdocs/rainloop"
    directory index "index.php"

    tcp { nodelay, backlog 10 }

    tls {
            certificate "/etc/ssl/webmail.example.com.crt"
            key "/etc/ssl/private/webmail.example.com.key"
    }

    hsts {
            max-age 31556952
            preload
    }

    # Value below is 25MB in bytes. 1MB = 1048576 bytes
    connection max request body 26214400

    location "/data*" {
            block return 403
    }

    location "*.php*" {
            fastcgi socket "/run/php-fpm.sock"
    }
}

Configure o PHP para permitir anexos de até 25 megabytes. Faça as seguintes alterações em /etc/php-7.3.ini:

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 25M
...
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 29M

Ative os módulos PHP necessários, copiando seus arquivos de configuração para /etc/php-7.3/

cp /etc/php-7.3.sample/* /etc/php-7.3/.

Verifique a sintaxe de /etc/httpd.conf

httpd -n

Habilite e inicie httpd e php-fpm.

rcctl reload httpd
rcctl enable php73_fpm
rcctl start php73_fpm

Teste final

Navegue para https://webmail.example.com/?admin.

O nome de usuário padrão é: admin
A senha padrão é: 12345 .

Navegue até cada uma das seções de configuração e faça as alterações desejadas. Depois de concluir a configuração, faça login no webmail emhttps://webmail.example.com



Leave a Comment

A IA pode lutar contra o aumento do número de ataques de ransomware

A IA pode lutar contra o aumento do número de ataques de ransomware

Os ataques de ransomware estão aumentando, mas a IA pode ajudar a lidar com os vírus de computador mais recentes? AI é a resposta? Leia aqui para saber se é AI boone ou bane

ReactOS: Este é o futuro do Windows?

ReactOS: Este é o futuro do Windows?

ReactOS, um sistema operacional de código aberto e gratuito está aqui com a versão mais recente. Será que ela pode atender às necessidades dos usuários modernos do Windows e derrubar a Microsoft? Vamos descobrir mais sobre esse estilo antigo, mas uma experiência de sistema operacional mais recente.

Fique conectado por meio do aplicativo WhatsApp Desktop 24 * 7

Fique conectado por meio do aplicativo WhatsApp Desktop 24 * 7

O Whatsapp finalmente lançou o aplicativo Desktop para usuários de Mac e Windows. Agora você pode acessar o Whatsapp do Windows ou Mac facilmente. Disponível para Windows 8+ e Mac OS 10.9+

Como a IA pode levar a automação de processos ao próximo nível?

Como a IA pode levar a automação de processos ao próximo nível?

Leia isto para saber como a Inteligência Artificial está se tornando popular entre as empresas de pequena escala e como está aumentando as probabilidades de fazê-las crescer e dar vantagem a seus concorrentes.

A atualização do suplemento do macOS Catalina 10.15.4 está causando mais problemas do que resolvendo

A atualização do suplemento do macOS Catalina 10.15.4 está causando mais problemas do que resolvendo

Recentemente, a Apple lançou o macOS Catalina 10.15.4, uma atualização suplementar para corrigir problemas, mas parece que a atualização está causando mais problemas, levando ao bloqueio de máquinas mac. Leia este artigo para saber mais

13 Ferramentas de Extração de Dados Comerciais de Big Data

13 Ferramentas de Extração de Dados Comerciais de Big Data

13 Ferramentas de Extração de Dados Comerciais de Big Data

O que é um sistema de arquivos de registro no diário e como ele funciona?

O que é um sistema de arquivos de registro no diário e como ele funciona?

Nosso computador armazena todos os dados de uma maneira organizada conhecida como sistema de arquivos Journaling. É um método eficiente que permite ao computador pesquisar e exibir arquivos assim que você clicar em search.https: //wethegeek.com/? P = 94116 & preview = true

Singularidade tecnológica: um futuro distante da civilização humana?

Singularidade tecnológica: um futuro distante da civilização humana?

À medida que a ciência evolui em um ritmo rápido, assumindo muitos de nossos esforços, os riscos de nos sujeitarmos a uma singularidade inexplicável também aumentam. Leia, o que a singularidade pode significar para nós.

Uma visão sobre 26 técnicas analíticas de Big Data: Parte 1

Uma visão sobre 26 técnicas analíticas de Big Data: Parte 1

Uma visão sobre 26 técnicas analíticas de Big Data: Parte 1

O impacto da inteligência artificial na saúde 2021

O impacto da inteligência artificial na saúde 2021

A IA na área da saúde deu grandes saltos nas últimas décadas. Portanto, o futuro da IA ​​na área da saúde ainda está crescendo dia a dia.