A B O U T M Y S E L F
ࣗݾհ
Tomokazu Kozuma
@Tomokazu106
౦ژۀେֶେֶӃଔۀޙɺαΠόʔΤʔδΣϯτͰεϚϗήʔϜͷαʔόɺΠϯ
ϑϥશൠΛ୲ɻԾ௨՟ʹ͍ٕͭͯज़ϒϩάΛॻ͍ͯΔ͏ͪʹ಄͠ɺຊ৬ͱ
ͯ͠ྗ͢ΔͨΊʹ(JODPʹೖࣾɻ(JODPͰϒϩοΫνΣʔϯͷϊʔυӡ༻ɺϋʔ
υϑΥʔΫରԠɺόοΫΤϯυͳͲൣғΛ୲ɻ
֓ཁ
• 'JSFTUPSFͰى͍ͬͯ͜ΔηΩϡϦςΟ
• (JODPͷSVMFTӡ༻ͷมભ
• -PDBM&NVMBUPSΛͬͨςετ
A G E N D A
Slide 8
Slide 8 text
'JSFTUPSFͰى͍ͬͯ͜Δ
P A R T 1
Slide 9
Slide 9 text
S e c u r i t y P r o b l e m
ԯ݅ͷػີใ͕ެ։͞Ε͍ͯΔ
• 'JSFCBTF%BUBCBTFΛ͍ͬͯΔͷ͕࿙Ӯ
• ݪҼSVMFTΛ͖ͪΜͱઃఆͰ͖͍ͯͳ͍
h t t p s : / / w w w . a p p t h o r i t y . c o m / c o m p a n y / p r e s s / p r e s s - r e l e a s e s / 6 2 - o f - e n t e r p r i s e s - e x p o s e d - t o -
s e n s i t i v e - d a t a - l o s s - v i a - f i r e b a s e - v u l n e r a b i l i t y
Slide 10
Slide 10 text
'JSFTUPSFͷηΩϡϦςΟجૅ
• ΫϥΠΞϯτ͔Β'JSFTUPSFΞΫηεͰ͖Δ
• ΞΫηεʹ"1*Ωʔ͕ඞཁ
• "1*ΩʔΫϥΠΞϯτʹຒΊࠐΉͷͰ୭ͰΈΕΔ
• ୭ͰΞΫηεͰ͖Δ͔ΒSVMFTͰ੍ޚ
A b o u t F i r e s t o r e
Slide 11
Slide 11 text
'JSFTUPSFSVMFT
• SFBEXSJUFݖݶ
• σʔλͷόϦσʔγϣϯ
T I T L E T E X T
Firestore
Cloud
3VMFT
"1*ΩʔͰΞΫηε
Slide 12
Slide 12 text
• SFBE୯ҰEPDΛऔಘ͢ΔHFUͱෳऔಘ͢ΔMJTU
• XSJUFDSFBUF
VQEBUF
EFMFUF
SFBEXSJUFݖݶ
R e a d R e s t r i c t i o n
match /Users/{uid} {
allow get: if someCondition();
allow create: if someCondition();
}
function someCondition() { … }
Slide 13
Slide 13 text
• ϦΫΤετσʔλɿSFRVFTUSFTPVSDFEBUB
• 'JSFTUPSFσʔλɿSFTPVSDFEBUB
• ܕɿJOU
TUSJOH
CPPM
UJNFTUBNQͳͲ
• LFZɿIBT"MM
IBT0OMZ
IBT"OZ
σʔλͷόϦσʔγϣϯ
D a t a V a l i d a t i o n
match /Users/{uid} {
allow update: if
request.resource.data.keys().hasAll(["name", "age"])
&& request.resource.data.name is string
&& request.resource.data.name != ""
&& request.resource.data.age == resource.data.age
}
Slide 14
Slide 14 text
5
S e t t i n g s e c u r e r u l e s
ػີσʔλผ֊ผSVMFTʹ͢Δ
ϫΠϧυΧʔυͰͷSVMFTઃఆʹؾΛ͚ͭΔ
ใ࿙Ӯ͠ͳ͍ͨΊͷSVMFTઃఆ
Slide 15
Slide 15 text
• ผ֊ʹͯ͠SVMFTઃఆΛݫ͘͢͠Δ
ػີσʔλผ֊
D i v i d e S e c r e t D a t a
match /Users/{uid} {
// ೝূࡁϢʔβʹެ։
allow read: if isAuthUser();
// ࣗͷσʔλ͚ͩʹΞΫηεՄ
match /Private/Info {
allow read: if isMyData(uid);
}
}
function isMyData(uid) {
return request.auth.uid == uid;
}
Slide 16
Slide 16 text
ϫΠϧυΧʔυͰͷSVMFTઃఆ
• ϫΠϧυΧʔυͰෳSVMF͕ద༻͞ΕͯڐՄ͞ΕΔ
U s i n g w i l d c a r d
match /Users/{uid} {
// ݅1
match /{allChildren=**} {
allow read: if isAuthUser();
}
// ݅2
match /Private/Info {
allow read: if isMyData(uid);
}
}
function isMyData(uid) {
return request.auth.uid == uid;
}
Slide 17
Slide 17 text
(JODPͷSVMFTӡ༻ͷมભ
P A R T 2
Slide 18
Slide 18 text
ϦϦʔεॳظ
• ϦϦʔεॳSVMFTͷςετ͕ͳ͔ͬͨ
• σϓϩΠ͔ͯ͠Βಈ࡞νΣοΫͳͷͰ͕͔͔࣌ؒΔ
• ։ൃڥʹӨڹΛ༩͑ͯ͠·͏
E a r l y S t a g e
Slide 19
Slide 19 text
ϦϦʔεதظ
• SVMFT͕ߦΛ͑͡Ίͯมߋ͕ࠔʹͳ͖ͬͯͨ
• SVMFTΛมߋͰ͖ΔΑ͏ʹςετίʔυΛ࣮
• ςετ͢Δʹςετ༻ͷ'JSFCBTF1SPKFDU͕ඞཁ
M i d d l e S t a g e
Slide 20
Slide 20 text
ςετ1SPKFDUΛͬͨςετ
Slide 21
Slide 21 text
SVMFTͷςετํ๏
• 'JSFCBTF4%,ʹ$MJFOU4%,ͱ"ENJO4%,͕͋Δ
• $MJFOU4%,͚ͩSVMFT͕ద༻͞ΕΔ
• +BWB4DSJQU͚ͩͭͷ4%,͕͋Δ
H o w t o t e s t
Firestore
Cloud
$MJFOU4%, "ENJO4%,
3VMFT
Slide 22
Slide 22 text
• UFTUͷͨΊͷ'JSFCBTFϓϩδΣΫτΛ࡞
• 'JSFCBTF"VUIFOUJDBUJPOͰಗ໊ೝূΛ༗ޮԽ
• ωοτϫʔΫӽ͠ͳͷͰ͕͔͔࣌ؒΔ
• SVMFTͱςετσʔλͷڝ߹
ςετ1SPKFDUΛͬͨํ๏
T e s t u s i n g p r o j e c t
Firestore
Cloud
Slide 23
Slide 23 text
ݱࡏ
• ݄ʹ'JSFTUPSF-PDBM&NVMBUPSൃද
• SVMFTͷςετϩʔΧϧڥ͚ͩͰ݁
• ଞਓͷ࡞ۀΛҙࣝ͠ͳͯ͘ྑ͘ͳͬͨͷͰSVMFTͷՃɺ
मਖ਼͕͘͢͠ͳͬͨ
P r e s e n t S t a g e
Slide 24
Slide 24 text
-PDBM&NVMBUPSΛͬͨςετ
P A R T 3
Slide 25
Slide 25 text
'JSFCBTF-PDBM&NVMBUPS
• ςετʹ!pSFCBTFUFTUJOHϞδϡʔϧΛ༻
• ೝূະೝূΞΧϯτɺ"ENJOΞΧϯτΛ؆୯ʹར
༻Ͱ͖Δ
• ςετσʔλͷڝ߹͠ͳ͍͠ɺUSVODBUF͠ͳ͍͍ͯ͘
• ςετ࣮ߦ͕࣌ؒʹݮ
L o c a l E m u l a t o r
Slide 26
Slide 26 text
L o a d r u l e s
SVMFTͷϩʔυ
import * as firebase from ‘@firebase/testing’
// rulesͷϩʔυ
firebase.loadFirestoreRules({
projectId: 'test-project-00',
rules: fs.readFileSync("firestore.rules", "utf8")
})
• SVMFTͷϩʔυҙͷQSPKFDU*EͰͰ͖Δ
• QSPKFDU*EผʹݸผͷσʔλۭؒΛ࣋ͯΔ
• ςετຖʹQSPKFDU*EΛมߋ͢Ε·ͬ͞Βͳঢ়ଶ
Slide 27
Slide 27 text
• ෳͷೝূΞΧϯτΛಉ࣌ʹѻ͑Δ
L o a d r u l e s
ΞΧϯτ࡞
// ೝূࡁΞΧϯτ
const firestore = firebase
.initializeTestApp({
projectId: ‘test-project-00',
auth: {uid: ‘test-account’}
})
.firestore();
// AdminΞΧϯτ
const adminFirestore = firebase
.initializeAdminApp({
projectId: 'test-project-00',
auth: ‘admin-account’
})
.firestore();
Slide 28
Slide 28 text
·ͱΊ
• SVMFTͷઃఆͰجຊతʹใ࿙Ӯ͛Δ
• ػີใ֊Λ͚ͯϫΠϧυΧʔυΛଟ༻͠ͳ͍
• SVMFTͷςετ-PDBM&NVMBUPSͰޮԽ
S u m m a r y