是否可以使用 AWS 用户的登录信息从其检索访问密钥


Is it possible to retrieve access keys from a AWS user using his login information?

我正在尝试构建一个项目来帮助用户管理他们的 S3 账户。但是,为此,他们需要手动向我提供他们的访问密钥。不过这很复杂,我想让他们更容易。

有没有办法使用他们的登录信息来检索他们的访问密钥?

如果解决方案是PHP中的,我更喜欢,但这不是义务。

谢谢!

如果 S3 存储桶适用于您账户中的用户

如果您谈论的是与您计数的账户中的用户关联的访问密钥,请查看 AWS Identity and Access Management/ListAccessKeys

IAM [ 身份和访问管理] 是一种 Web 服务,可实现 AWS 客户在其 AWS 下管理用户和用户权限 帐户

如果 S3 存储桶适用于您不拥有的账户

如果您谈论的是与其他人的 AWS 账户关联的访问密钥(以及根据您的评论是私有密钥),根据 AWS,您只能从 AWS 安全凭证页面上的访问密钥选项卡获取访问密钥。

这是完全有道理的,因为访问密钥是受保护的帐户机密。 提供用于检索机密的 API 是没有意义的。

此外,如果用户向您提供了他们的帐户凭据,那将是一个巨大的安全问题。 您可以启动所需的任何 AWS 资源,他们将承担责任。 即使他们 100% 信任您不这样做,如果您允许该登录数据被黑客入侵,黑客也可以这样做。 如果LinkedIn登录数据可以被黑客入侵,您也可能被黑客入侵。

给定用户名,您可以使用ListAccessKeys api列出用户的访问密钥。

但是你的问题似乎有一个问题。为了使用上述 api,您需要使用访问密钥 - 密钥对对请求进行签名。而且我认为您不会因为他们正在为其他工具构建工具,除非您的 aws 账户中的用户至少在 s3 和 IAM 上具有完全权限。

然后,这将允许您仅获取访问密钥而不是其机密。询问机密就像向某人询问密码一样,以便您可以代表他们做某事。因此,您无法通过任何 API 从 aws 获取密钥,获取密钥的唯一方法是用户将其提供给您。

我找到了一种让它工作的方法。基本上,我已经设置了一个Selenium Webdriver服务器并下载了所有必需的C#文件。然后我创建了这个小脚本:

    static void Main(string[] args)
    {
        IWebDriver driver;
        driver = new FirefoxDriver();
        driver.Navigate().GoToUrl("https://aws-portal.amazon.com/gp/aws/securityCredentials");
        driver.FindElement(By.Id("ap_email")).Clear();
        driver.FindElement(By.Id("ap_email")).SendKeys("USER@EMAILACCOUNT.COM");
        driver.FindElement(By.Id("ap_password")).Clear();
        driver.FindElement(By.Id("ap_password")).SendKeys("HISPASSWORD");
        driver.FindElement(By.Id("signInSubmit")).Click();
        IList<IWebElement> keys = driver.FindElements(By.LinkText("Show"));
        int nbElems = keys.Count;
        System.Console.WriteLine(nbElems+" keys");
        foreach (IWebElement k in keys)
        {
            String toparse = k.GetAttribute("href");
            Regex regex = new Regex(@"'(?<key>.*)','(?<secret>.*)'");
            GroupCollection groups = regex.Match(toparse).Groups;
            System.Console.WriteLine(groups["key"] + " " + groups["secret"]);
        }
        driver.FindElement(By.LinkText("Sign Out")).Click();
        driver.Quit();
    }

现在我只需要找到一种方法将用户信息安全地发送到此脚本。

谢谢你们的帮助!