DevOps工具配置不当,微软、任天堂、华为等50余家名企源码遭泄露

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DevOps工具配置不当,微软、任天堂、华为等50余家名企源码遭泄露相关的知识,希望对你有一定的参考价值。

参考技术A 据外媒 BleepingComputer 报道,由于基础架构配置有误,来自技术、金融、电商、制造业等众多领域的数十家知名公司源码遭到泄露。

这些公司包括微软、Adobe、联想,AMD、高通,摩托罗拉、海思、任天堂、迪士尼、江森自控等,而且这一名单还在不断增长中。

来自瑞士的开发者 Tillie Kottmann 通过各类第三方源收集到了这些漏洞,他自己也找到了不少 DevOps 工具中的配置错误,而这些工具可以用来访问源代码。

遭泄露的源码被发布在 GitLab 上一个公开存储库中,并被标记为 “exconfidential” (绝密),以及 “Confidential & Proprietary”(保密&专有)。

(更新:GitLab 仓库均已被删除,Kottmann 现采用 telegram 群组来公布这些信息。)

根据安全研究人员 Bank Security 提供的信息,该存储库中大约包含了超过 50 家公司的源码。但有一些文件夹是空的,还有一些存在硬编码凭证——一种创建后门的方式。

Kottmann 提到,一些代码库中确实存在硬编码凭证,他在发布前已尽可能地将其删除,“以避免造成直接伤害或是助长更大的破坏”。另外,他也坦承自己并未在发布前与每一家受影响的公司进行联系,但他们确保自己“尽了最大的努力将负面影响最小化”。

目前,Kottmann 已应部分企业的要求删除了代码。例如 Daimler AG,梅赛德斯-奔驰的母公司;联想的文件夹也已经空空如也。针对有移除代码要求的公司,Kottmann 表示愿意遵守,并乐意提供信息,“帮助公司增强基础架构的安全性”。

事实上,从收到的 DMCA 通知数量(估计至多 7 份)和法律代表等的联系来看,许多公司仍对代码泄露事件不知情。另有部分公司没有撤除代码的意思,甚至有公司觉得“挺有趣”,只想知道 Kottmann 是如何获得代码的。

此次泄露的代码中,有一些项目早已由其原始开发者公开发布过,或是已经有很长时间不再更新和维护。网络安全公司 ImmuniWeb 的创始人兼首席执行官 Ilia Kolochenko 指出,“从技术角度来看,这次的泄露并不算很严重……若没有每天的支持和改进,源代码也会迅速贬值”。

尽管如此,这样大规模的泄露事件原因还是值得引起注意。许多公司使用错误的 DevOps 工具配置,引发源码暴露。Kottmann 及其团队近期正在 探索 运行 SonarQube 的服务器,他们发现,有成千上万的公司由于未能正确保护 SonarQube 安装而暴露了源码。

对于泄露源码的行为,安全专家 Jake Moore 对 科技 网站 Tom's Guide 表示,“失去对源代码的控制就像将银行蓝图交给抢劫犯一样……受影响的网站应立即采取保护措施……若用户在公司之前发现自己的数据遭到泄露,那无疑是在伤口上撒盐”。

基于法律层面,Kolochenko 认为源码发布者可能会因侵犯版权或违反计算机法而被起诉,但通常大型公司不会上诉,他们宁愿从存储库中快速删除源代码并修复其内部 DevOps 安全流程。

为此,Kolochenko 建议“企业应修改并持续监控 DevOps 操作,将其转换为敏捷的 DevSecOps”。

DevOps 系列工具之 Puppet 资源简介

资源清单

Puppet 可以管理的所有项目被称为 Puppet 资源。软件包、配置文件和服务都是 Puppet 所能管理的资源。资源指令组合为 Puppet 清单(Manifest)文件。
资源是 Puppet 配置管理脚本(清单)的组成部分。资源又以下一些元素组成:
类型:将要配置的资源类型(软件包、服务、文件等)。资源类型有许多种。
标题:配置管理脚本引用资源的方式
属性:为资源指定的位置。不同资源类型有不同的属性
提供者:与配置管理脚本引用资源方式相关的工具。通常不在资源陈述中说明。Puppet 根据资源类型自动使用正确的提供者(例如:在基于 CentOS 的操作系统上安装软件包时使用 yum)

资源调用顺序

清单是资源的集合,它们是管理员用于管理环境中服务器的配置脚本。before、require、notify和subscribe元参数可以定义清单中资源之间的关系
require 确保指定资源在自身资源部署之前存在
subscribe 和require 类似,但有一个额外的功能:Puppet 将监控目标资源的任何更改,并执行相应的操作作为响应。对于服务资源,在检查到配置文件中的更改后重新启动服务

    package { ‘apache’:
    name => ‘httpd’,
    ensure => installed,
    }

    file { ‘apacheconf’:
        name => ‘/etc/httpd/conf/httpd.conf’,
        ensure => file,
        mode => 600,
        source => ‘/etc/puppet/files/httpd.conf’,
        require => Package[‘apache’],
    }

    service { ‘apache’:
    name = >’httpd’,
    ensure => running,
    enable => true,
    subscribe => File[‘apacheconf’],
}

在第一次声明资源时,类型名是小写的,以后在清单中引用时类型名的第一个字母为大写。

before 和 notify 分别为 require 和 subscribe 相反。如果在清单中使用 before 和 notify ,则写法如下:

    package {‘apache’:
        name => ‘httpd’,
        ensure => installed,
        before => File[‘apacheconf’],
    }

    file {‘apacheconf’:
        name => ‘/etc/httpd/conf/httpd.conf’,
        ensure => file,
        mode => 600,
        source => ‘/etc/puppet/files/httpd.conf’,
        notify => Service[‘apache’],
    }

    service {‘apache’:
        name => ‘httpd’,
        ensure => running,
        enable => true,
    }

变量的使用

在清单文件中,所有的变量清单都以 $ 作为前缀,包括自动生成的 fact 变量。变量不需要指定数据类型。
在代码中使用包含字符串值的变量时,必须使用双引号而不是单引号。

    $webserver=‘httpd’
    file {‘apacheconf’:
        name => “/etc/$webserver/conf/$webserver.conf”,
        ensure => file,
        mode => 600,
        source => “/etc/puppet/file/$webserver.conf”,
        require => Package[‘apache’],
    }

条件语句

Puppet 支持的 if 和 case 条件表达式

    if $operatingsystem == ‘centos’ {
        $webserver = ‘httpd’
        $confpath = “/etc/$webserver/conf/$webserver.conf”
    }

    elsif $operatingsystem = ‘ubuntu’ {
        $webserver = ‘apache2’
        $confpath = “/etc/$webserver/$webserver.conf”
    }

    else {
        fail (“Unsupported OS”)
    }

case 条件语句

    case $operatingsystem {
        centos: {
            $webserver = ‘httpd’
            $confpath = “/etc/$webserver/conf/$webserver.conf”
        }
        ubuntu: {
            $webserver = ‘apache2’
            $confpath = “/etc/$webserver/$webserver.conf”
        }
        default: {
            fail(“Unsupported OS”)
        }
    }

    package { ‘apache’:
        name => $webserver,
        ensure => installed,
    }
    file {‘apacheconf’:
        name => $confpath,
        ensure => file,
        mode => 600,
        source => “/etc/puppet/files/$webserver.conf”,
        require => Package[‘package’],
    }

    service {‘apache’:
        name => $webserver,
        ensure => running,
        enable => true,
        subscribe => File[‘apacheconf’],
    }

为了促进高效的代码重用,Puppet Labs 设计了 Puppet 类功能,其概念类似于面向对象编程语言中的类。
class apache {
….
}

只需在原来的代码上修改3行就可以实现一个类,

Puppet Forge 在线共享模块存储库,http://forge.puppetlabs.com
模块需要一种特殊的树结构,Puppet 清单才能正确访问它们。Puppet 生成模块目录文件夹的命令:
puppet module generate username-modulename
用户名+模块名 格式命名,需要修改为模块名,
子目录: files templates

manifests 是重要的文件夹,包含与模块相关的所有Puppet 代码。标准模块的惯例是有一个定义类的特殊清单文件 init.pp。
files 在清单执行期间分发的所有文件(如 apache 配置文件)必须放置在这个目录下
lib 如果编写了任何自定义fact 变量或者类型,将代码放在这个目录下
spec 这个文件夹包含用于lib文件夹中自定义代码的测试
templates 如果想要部署根据运行时信息更改的软件包配置或者内容文件,将它们和一些嵌入ruby erb 代码一起放在这个目录
tests 放置模块使用方法的示例
metadata.json 包含semver 格式的模块版本名称,以及Puppet module generate 命令提供的其余数据

把上面的代码写入:
/etc/puppetlabs/puppet/modules/apache/manifests/init.pp
把配置文件放入:
/etc/puppetlabs/puppet/modules/apache/files 目录

source => “puppet:///modules/apache/$webserver.conf”

在 master agent 模式中,让agent端应用新配置,可以手动触发,也可以等到下一次自动化 Puppet 代理执行。
手动触发:
在 Agent 端执行
puppet agent -td
puppet agent 命令告诉代理执行 Puppet 主服务器为它保留的指令
puppet apply 指令用于本地 puppet 清单的临时执行

以上是关于DevOps工具配置不当,微软、任天堂、华为等50余家名企源码遭泄露的主要内容,如果未能解决你的问题,请参考以下文章

6步搭建一个飞机大战游戏

DevOps - 配置管理工具Ansible

微软DevOps的转型旅程

对话徐磊:没有不适合DevOps的企业,只有不适合DevOps的人

20多年前微软曾计划收购,任天堂嘲讽道:“笑死我了”

微软改名部又出动啦!微软宣布VSTS改名为Azure DevOps