programing

Firebase apiKey를 공개해도 안전한가요?

javaba 2022. 10. 27. 23:38
반응형

Firebase apiKey를 공개해도 안전한가요?

Firebase Web-App 가이드에는 다음과 같이 기술되어 있습니다.apiKey파이어베이스 html.

// TODO: Replace with your project's customized code snippet
<script src="https://www.gstatic.com/firebasejs/3.0.2/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    apiKey: '<your-api-key>',
    authDomain: '<your-auth-domain>',
    databaseURL: '<your-database-url>',
    storageBucket: '<your-storage-bucket>'
  };
  firebase.initializeApp(config);
</script>

으로써, 「」는apiKey이치노

열쇠의 용도는 무엇이며, 정말로 공개를 의도하고 있는 것입니까?

apiKey구글 파이어베이스누군가가 그것을 아는 것은 보안상의 위험이 아닙니다.사실, 파이어베이스 프로젝트와 상호작용하기 위해서는 그들이 그것을 알아야 합니다.이 설정 데이터는 Firebase를 백엔드로 사용하는 모든 iOS 및 Android 앱에도 포함되어 있습니다.

그런 합니다.https://<app-id>.firebaseio.com. 이것이 보안 위험이 아닌 이유에 대해서는 다음 질문을 참조하십시오.Firebase의 서버 측 보안 규칙을 사용하여 인증된 사용자만 백엔드 서비스에 액세스할 수 있도록 하는 등 Firebase 데이터 수정을 제한하는 방법

Firebase 백엔드 서비스에 대한 모든 데이터 액세스를 허용하는 방법을 알아보려면 Firebase 보안 규칙에 대한 문서를 읽어 보십시오.이러한 규칙은 파일 스토리지 및 데이터베이스 액세스를 제어하며 Firebase 서버에서 적용됩니다.따라서 사용자의 코드든 구성 데이터를 사용하는 다른 사용자의 코드든 보안 규칙에서 허용하는 작업만 수행할 수 있습니다.

Firebase가 이러한 값을 사용하는 이유와 할당량을 설정할 수 있는 다른 설명은 API 키 사용 및 관리에 대한 Firebase 문서를 참조하십시오.


이 구성 데이터를 버전 제어에 커밋할 위험을 줄이려면 Firebase Hosting의 SDK 자동 구성을 사용하는 것이 좋습니다.키는 브라우저에 같은 형식으로 표시되지만 더 이상 코드에 하드 코딩되지 않습니다.


갱신(2021년 5월):Firebase App Check라고 불리는 새로운 기능을 통해 Firebase 프로젝트의 백엔드 서비스에 대한 액세스를 특정 프로젝트에 등록된 iOS, Android 및 웹 앱에서만 사용할 수 있게 되었습니다.

일반적으로 이 기능을 위에서 설명한 사용자 인증 기반 보안과 결합하여 앱을 사용하는 사용자로부터 다른 보호막 역할을 할 수 있습니다.

App Check를 보안 규칙과 결합하면 오용에 대한 광범위한 보호와 각 사용자가 액세스할 수 있는 데이터를 세부적으로 제어할 수 있으며 클라이언트 측 애플리케이션 코드에서 데이터베이스에 직접 액세스할 수 있습니다.

여기 prufro와 Frank van Puffelen의 답변을 바탕으로 스크랩을 방지하는 것이 아니라 API 키를 사용하는 것을 조금 더 어렵게 할 수 있는 설정을 정리했습니다.

경고:이 방법으로 데이터를 가져오려면 Chrome에서 JS 콘솔을 열고 다음과 같이 입력하면 됩니다.

firebase.database().ref("/get/all/the/data").once("value", function (data) {
    console.log(data.val());
});

데이터베이스 보안 규칙만 데이터를 보호할 수 있습니다.

그러나 저는 프로덕션 API 키 사용을 다음과 같이 도메인 이름으로 제한했습니다.

  1. https://console.developers.google.com/apis
  2. 파이어베이스 프로젝트 선택
  3. 자격 정보
  4. API 키에서 브라우저 키를 선택합니다."브라우저 키(Google 서비스에서 자동 생성)"와 같이 표시됩니다.
  5. "이 HTTP 레퍼러(웹 사이트)"에서의 URL을 추가합니다(예:projectname.firebaseapp.com/*)

이제 앱은 이 특정 도메인 이름에서만 작동합니다.그래서 localhost 개발을 위한 다른 API Key를 만들었습니다.

  1. [ Create credentials ]> [ API Key ]을 클릭합니다.

기본적으로는 Emanuel Campos가 언급한 바와 같이 Firebase는 화이트리스트와 Firebase 호스팅 도메인만 지원합니다.


실수로 잘못된 API 키를 공개하지 않도록 하기 위해 다음 방법 중 하나를 사용하여 생산 시 보다 제한된 API 키를 자동으로 사용합니다.

Create-React-App 셋업

»/env.development:

REACT_APP_API_KEY=###dev-key###

»/env.production:

REACT_APP_API_KEY=###public-key###

»/src/index.js

const firebaseConfig = {
  apiKey: process.env.REACT_APP_API_KEY,
  // ... 
};

보안/구성 키를 클라이언트에 노출할 수 없습니다.누군가가 첫날부터 모든 개인 정보를 훔칠 수 있어서가 아니라 누군가가 과도한 요구를 해서 당신의 할당량을 소진하고 구글에 많은 돈을 빚질 수 있기 때문입니다.

사람이 있으면 안 되는 장소에 접근하지 못하도록 제한하는 것, DOS 공격 등 많은 개념을 고려해야 합니다.

클라이언트가 먼저 웹 서버에 접속하여 클라이언트와 서버 사이 또는 서버와 파이어베이스 사이에 captcha, cloudflare, 커스텀보안을 도입하면 바로 사용할 수 있습니다.적어도 용의자의 활동이 방화벽 기지에 도달하기 전에 멈출 수 있다.당신은 훨씬 더 유연해질 것입니다.

내부 사용에 클라이언트 기반 구성을 사용하는 경우 적절한 사용 시나리오는 하나뿐입니다.예를 들어 내부 도메인이 있고 외부인이 접근할 수 없다고 확신하기 때문에 브라우저 -> FireBase Type 등의 환경을 설정할 수 있습니다.

API 키 노출은 사용자/비밀번호 등록이 활성화되면 취약성을 생성합니다.API 키를 사용하여 누구나 새 사용자 계정을 만들 수 있는 개방형 API 엔드포인트가 있습니다.그런 다음 이 새 계정을 사용하여 Firebase Auth 보호 앱에 로그인하거나 SDK를 사용하여 사용자/패스 및 쿼리 실행을 인증할 수 있습니다.

구글에 보고했지만 제대로 작동한다고 하네요.

사용자/비밀번호 계정을 비활성화할 수 없는 경우 다음을 수행해야 합니다.클라우드 함수를 만들어 새 사용자를 자동으로 비활성화합니다.새 DB 항목을 만들고 생성하여 액세스를 관리합니다.

예: MyUsers/{userId}/액세스: 0

exports.addUser = functions.auth.user().onCreate(onAddUser);
exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);

액세스 > 1 의 유저에게만 판독을 허가하도록 룰을 갱신합니다.

만약 리스너 함수가 계정을 빠르게 비활성화하지 않으면 읽기 규칙에 따라 데이터를 읽을 수 없게 됩니다.

데이터베이스 규칙을 정확하게 작성하면 데이터를 보호하는 데 충분하다고 생각합니다.또한 데이터베이스를 그에 맞게 구성하기 위해 따를 수 있는 가이드라인이 있습니다.예를 들어 사용자 아래에 UID 노드를 만들고 그 아래에 모든 정보를 입력합니다.그 후 다음과 같은 간단한 데이터베이스 규칙을 구현해야 합니다.

  "rules": {
    "users": {
      "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}

다른 사용자는 다른 사용자의 데이터를 읽을 수 없으며 도메인 정책은 다른 도메인에서 들어오는 요청을 제한합니다.자세한 내용은 Firebase 보안 규칙을 참조하십시오.

원래 질문(API 키가 노출될 수 있다는 것, DB 규칙에서 데이터 보호를 설정해야 한다는 것)에 대한 답변이 있었지만, DB의 특정 부분에 대한 접근을 제한하는 솔루션도 찾고 있었습니다.그래서 이 글과 가능성에 대한 개인적인 조사를 읽은 후, 저는 권한이 없는 사용자의 데이터 사용을 제한하기 위한 약간 다른 접근법을 생각해냈습니다.

사용자도 같은 uid로 DB에 저장합니다(프로파일 데이터도 DB에 저장).그래서 DB 규칙을 다음과 같이 설정합니다.

".read": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()",
".write": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()"

이렇게 하면 이전에 저장된 사용자만 DB에 새 사용자를 추가할 수 있으므로 계정이 없는 사용자는 DB에서 작업을 수행할 수 없습니다.

또, 새로운 유저를 추가하는 것은, 유저가 특별한 롤을 가지고 있는 경우만, admin 또는 그 유저 자신이 편집하는 경우(다음과 같은 경우)

"userdata": {
  "$userId": {
    ".write": "$userId === auth.uid || root.child('/userdata/'+auth.uid+'/userRole').val() === 'superadmin'",
   ...

API 키의 노출은 보안상의 위험은 없지만 누구나 자신의 사이트에 자격 정보를 올릴 수 있습니다.

open api key는 파이어베이스에서 많은 자원을 사용할 수 있는 공격으로 이어지며, 이는 분명 비용이 많이 들 것입니다.

파이어베이스 프로젝트 키는 항상 도메인/IP로 제한할 수 있습니다.

https://console.cloud.google.com/apis/credentials/key

프로젝트 ID와 키를 선택하고 Android/iOs/web 앱으로 제한합니다.

포함해도 괜찮으며 Firebase ML 또는 Firebase Authentication 사용 시에만 각별한 주의가 필요합니다.

Firebase용 API 키는 일반적인 API 키와 다릅니다.일반적으로 사용되는 API 키와 달리 Firebase 서비스용 API 키는 백엔드 리소스에 대한 액세스를 제어하는 데 사용되지 않습니다. 이는 Firebase 보안 규칙을 통해서만 수행할 수 있습니다.보통 API 키를 신중하게 보호해야 합니다(예를 들어 볼트 서비스를 사용하거나 키를 환경 변수로 설정하는 등). 단, Firebase 서비스용 API 키는 코드 또는 체크인된 구성 파일에 포함할 수 있습니다.

Firebase 서비스용 API 키는 코드에 포함해도 안전하지만, 예를 들어 Firebase ML을 사용하거나 이메일/패스워드 로그인 방식으로 Firebase 인증을 사용하는 경우 등 API 키에 제한을 적용해야 하는 몇 가지 구체적인 경우가 있습니다.이 페이지의 뒷부분에서 이러한 사례에 대해 자세히 알아보십시오.

자세한 내용은 공식 문서를 참조하십시오.

저는 github 페이지에 블로그 사이트를 만들고 있습니다.모든 블로그 페이지 끝에 코멘트를 넣을 아이디어가 있어요.파이어베이스를 어떻게 입수하고 데이터를 제공하는지 이해합니다.

프로젝트 및 콘솔 사용 시에도 여러 번 테스트를 거쳤습니다.나는 vlit가 취약하다는 말에 완전히 동의하지 않는다.파이어베이스에 의해 권장되는 프라이버시 절차를 따랐다면 API 키를 공개적으로 공개하는 것은 문제가 되지 않습니다.https://console.developers.google.com/apis 에 액세스 해, 시큐러티 스탭으로부터 액세스 합니다.

이 정보를 노출하면 안 됩니다.공개, 특히 api 키.사생활 유출로 이어질 수 있습니다.

웹 사이트를 공개하기 전에 숨겨야 합니다.두 가지 이상의 방법으로 할 수 있습니다.

  1. 복잡한 코딩/숨김
  2. 파이어베이스 SDK 코드를 웹 사이트나 앱 하단에 입력하기만 하면 자동으로 모든 기능이 작동합니다.API 키를 아무 곳에나 둘 필요가 없습니다.

언급URL : https://stackoverflow.com/questions/37482366/is-it-safe-to-expose-firebase-apikey-to-the-public

반응형