#salesforce release winter 22
Explore tagged Tumblr posts
Text
Middlemen without enshittification

I'm on tour with my new novel The Bezzle! Catch me next in SALT LAKE CITY (Feb 21, Weller Book Works) and SAN DIEGO (Feb 22, Mysterious Galaxy). After that, it's LA, Seattle, Portland, Phoenix and more!
Enshittification describes how platforms go bad, which is also how the internet goes bad, because the internet is made of platforms, which is weird, because platforms are intermediaries and we were promised that the internet would disintermediate the world:
https://pluralistic.net/2024/01/30/go-nuts-meine-kerle/#ich-bin-ein-bratapfel
The internet did disintermediate a hell of a lot of intermediaries – that is, "middlemen" – but then it created a bunch more of these middlemen, who coalesced into a handful of gatekeepers, or as the EU calls them "VLOPs" (Very Large Online Platforms, the most EU acronym ever).
Which raises two questions: first, why did so many of us end up flocking to these intermediaries' sites, and how did those sites end up with so much power?
To answer the first question, I want you to consider one of my favorite authors: Crad Kilodney (RIP):
https://archive.org/details/thecradkilodneypapers
When I was growing up, Crad was a fixture on the streets of Toronto. All through the day and late into the evening, winter or summer, Crad would stand on the street with a sign around his neck ("Very famous Canadian author, buy my books, $2" or sometimes just "Margaret Atwood, buy my books, $2"). He wrote these deeply weird, often very funny short stories, which he edited, typeset, printed, bound and sold himself, one at a time, to people who approached him on the street.
I had a lot of conversations with Crad – as an aspiring writer, I was endlessly fascinated by him and his books. He was funny, acerbic – and sneaky. Crad wore a wire: he kept a hidden tape recorder rolling in his coat and he secretly recorded conversations with people like me, and then released a series of home-duplicated tapes of the weirdest and funniest ones:
https://archive.org/details/on-the-street-crad-kilodney-vol-1
I love Crad. He deserves more recognition. There's an on-again/off-again documentary about his life and work that I hope gets made some day:
https://pluralistic.net/2020/09/09/free-sample/#putrid-scum
But – and this is the crucial part – there are writers out there I want to hear from who couldn't do what Crad did. Maybe they can write books, but not edit them. Or edit them, but not typeset them. Or typeset, but not print. Or print, but not spend the rest of their lives standing on a street-corner with a "PUTRID SCUM" sign around their neck.
Which is fine. That's why we have intermediaries. I like booksellers (I was one!). I like publishers. I like distributors. I like their salesforce, who go forth and convince the booksellers of the world to stock books like mine. I have ten million things I want to do before I die, and I'm already 52, and being a sales-rep for a publisher isn't on my bucket list. I am so thankful that someone else wants to do this for me.
That's why we have intermediaries, and why disintermediation always leads to some degree of re-intermediation. There's a lot of explicit and implicit knowledge and specialized skill required to connect buyers and sellers, creators and audiences, and other sides of two-sided markets. Some producers can do some of this stuff for themselves, and a very few – like Crad – can do it all, but most of us need some help, somewhere along the way. In the excellent 2022 book Direct, Kathryn Judge lays out a clear case for all the good that middlemen can do:
https://pluralistic.net/2022/06/12/direct-the-problem-of-middlemen/
So why were we all so anxious for disintermediation back in the late 1990s? Here's a hint: it wasn't because we hated intermediaries – it was because we hated powerful intermediaries.
The point of an intermediary is to serve as a conduit between producers and consumers, buyers and sellers, audiences and creators. When an intermediary gains power over the audience – say, by locking them inside a walled garden – and then uses that lock-in to screw producers and appropriate an ever larger share of the value going between them, that's when intermediaries become a problem.
The problem isn't that someone will handle ticketing for your gig. The problem is that Ticketmaster has locked down all the ticketing, and the venues, and the promotions, and it uses that power to gouge fans and rip off artists:
https://pluralistic.net/2022/11/20/anything-that-cant-go-on-forever-will-eventually-stop/
The problem isn't that there's a well-made website that lets you shop for goods sold by many small merchants and producers. It's that Amazon has cornered this market, takes $0.51 out of every dollar you spend there, and clones and destroys any small merchant who succeeds on the platform:
https://pluralistic.net/2023/04/25/greedflation/#commissar-bezos
The problem isn't that there's a website where you can stream most of the music ever recorded. It's that Spotify colludes with the Big Three labels to rip off artists and sneaks crap you don't want to hear into your stream in order to collect payola:
https://pluralistic.net/2022/09/12/streaming-doesnt-pay/#stunt-publishing
The problem isn't that there's a website where you can buy any audiobook you want. It's that Amazon's Audible locks every book to its platform forever and steals hundreds of millions of dollars from creators:
https://pluralistic.net/2022/07/25/can-you-hear-me-now/#acx-ripoff
The problem, in other words, isn't intermediation – it's power. The thing that distinguishes a useful intermediary from an enshittified bully is power. Intermediaries gain power when our governments stop enforcing competition law. This lets intermediaries buy each other up and corner markets. Once they've formed cozy cartels, they can capture their regulators and commit rampant labor, privacy and consumer violations with impunity. That capture also lets them harness governments to punish smaller players that want to free workers, creators, audiences and customers from walled gardens. It also hands them a whip-hand over their workers, so that any worker who refuses to aid in these nefarious plans can be easily fired:
https://pluralistic.net/2024/01/30/go-nuts-meine-kerle/#ich-bin-ein-bratapfel
A world with intermediaries is a better world. As much as I love Crad Kilodney's books, I wouldn't want to live in a world where the only books on my shelves came from people prepared to stand on a street-corner wearing a "FOUL PUS FROM DEAD DOGS" sign.
The problem isn't intermediaries – it's powerful intermediaries. That's why the world's surging antitrust movement is so exciting: by reinstating competition law, we can keep intermediaries small and comparatively weak, so that creators and audiences, drivers and riders, sellers and buyers, and other groups seeking to connect will not find themselves made subservient to middlemen.
If you'd like an essay-formatted version of this post to read or share, here's a link to it on pluralistic.net, my surveillance-free, ad-free, tracker-free blog:
https://pluralistic.net/2024/02/19/crad-kilodney-was-an-outlier/#intermediation
#pluralistic#intermediation#disintermediation#publishing#creative labor#middlemen#distributors#publishers#publicists#enshittification#monopoly#monopsony#crad kilodney#trustbusting#antitrust
228 notes
·
View notes
Text
What are Winter 22 Sneak Peek for Salesforce Flows?
What are Winter 22 Sneak Peek for Salesforce Flows?
Hello #Trailblazers, In this blog post, we will talk about the sneak peek of Salesforce Flows ( the features which will be coming in Winter 22 release ) 1 – Subflow for Record Trigger Flow Record triggered flows now has the capability to call the sub-flow that means you can put the complex logic in multiple small flows 2 – Record-Trigger Start element New Changes After the winter 22 release,…
View On WordPress
#flow features salesforce#Lightning Flow Builder#lightning flows#release salesforce#Salesforce#salesforce flow#salesforce flow features#Salesforce Release#salesforce release winter 22#winter 22#winter 22 release
0 notes
Text
5 Things Salesforce Developers Can Get Excited for in 2022
Introduction
Salesforce is continually evolving to deliver amazing experiences for its end users. The Spring ‘22 release, just like all Salesforce updates - which happen three times a year - had interesting things for developers to be excited about.
In this blog, we take a look at these, as well as a couple of features that aren't exclusive to this release but should be available later this year.
Foyer
Since we can design applications that connect Slack and Salesforce, you’ll need a middleware layer to connect the two. Foyer is a feature that will be available later this year (safe harbor). The foyer should enable us to focus development time on Slack and Salesforce platforms, drastically reducing the time it takes to build out solutions. Rather than coding the middleware from scratch, Foyer seamlessly integrates it into the system, making configuration simpler.

Foyer was officially announced at Dreamforce in September 2021 and is now closed in Beta. It will be initially offered to ISV Partners for inclusion in their AppExchange packages, but now is a great time to talk to your administrators to see how these Slack apps can be used to streamline your business processes.
UI Test Automation Model (UTAM)
This will enable a more powerful method for developing automated UI tests. Traditionally, these types of tests have been very difficult to write and maintain, often requiring third-party tooling and solution.
UTAM claims to make this much better by introducing the common Page Object model design pattern (which you may have seen if you’ve used Selenium for testing). UTAM’s Page Objects are written in JSON, and the big idea is to move away from Xpath locators to target DOM nodes, and instead utilize CSS.
Salesforce plans to make UTAM an open-source, with the possibility of it playing a larger role outside of Salesforce development.
Lightning Web Security
Salesforce Locker Service has provided an extra layer of security to the web components served by our orgs, irrespective of whether they’re LWC or Aura components written by us, or provided by our suppliers. This crucial security has come as a technological cost, whether in the form of restricted cross-component support or reduced third-party JavaScript libraries that are compatible with Locker Service.
Lightning Locker is a robust security framework for Lightning components. It increases security by separating Lightning Components belonging to one namespace from those belonging to another.
Flow Trigger order
From the onset, there has been no particular way to specify the order in which the record-triggered flow should run. This led to the adoption of the “one flow per object” practice, which in turn, led to the construction of large flows.

However, this new update now allows for “trigger order” to be specified against before- or after-save flows. This is a huge thing for Salesforce Admins and Developers.
Flow is evolving rapidly, and there are still noticeable parity gaps between flow and code from a developer’s perspective. It should be treated seriously and not overlooked for Apex without consideration.
Functions
Since the Winter ‘22 release, Salesforce Functions have been available. Still, relatively high costs and some other factors have led to slow adoption. In my opinion, Functions are the key solutions simpler, and we’re hoping for a price decrease or remodeling to happen this year.

You don’t need a license to get started with Salesforce Function. You can use the Salesforce Developer Tools to design and test functions right now.
0 notes
Link
Winter’22 brings a bunch of new features and functionality to play around with. Salesforce releases bring excitement to Admins & Developers, as well as users who get UI improvements.
Winter ’22 has introduced new improvements to Salesforce Flows, Profiles, Permission Sets, and plenty of them to shout about!
Here’s my summary of few new improvements coming to Flows, Profile, and Permission Sets…
visit: https://www.mirketa.com/whats-new-in-winter-22/
#salesforce#salesforce consultant#salesforce consulting companies#salesforce implementation consultant
0 notes
Link
With the Winter’22 release, Salesforce users have the opportunity to add enhancements to their Salesforce solutions. Here are some of the most anticipated updates of the year.
0 notes
Photo
8 IMPRESSIVE FEATURES OF SALESFORCE WINTER ‘22 RELEASE https://lnkd.in/gqydyWbt #cloudvandana #salesforce #salesforcepartner #salesforceconsultant #salesforceservices #AppExchange #salesforcecrm #winter22
0 notes
Link
Deliver Scalable Experiences Without Limits Using Functions We’re proud to launch the Salesforce Functions Beta in our Summer ‘21 release, and we look forward to its GA in our Winter ’22 release. Salesforce Functions is a new service on the Salesforce Platform that enables you to deliver more scalable experiences by extending the data and workflows that you already have, making them more robust with the power of elastic compute and open language flexibility. You can now significantly accelerate developer productivity on trusted, managed Salesforce infrastructure through pre-authenticated and preconfigured access to Salesforce data and integration with low-code tools like Flow. Functions allows developers to write code that implements their business logic, which can then be assembled as building blocks in Flows or integrated with Lightning Web Components. Salesforce Functions amplifies low-code productivity with the power and flexibility of custom software, including access to open language ecosystems of libraries and packages. Let’s take a deeper look into what this actually means, and along the way, we’ll show you the updated Developer Tools experience. What’s new in the Salesforce Functions Beta Higher performance with no limits and elastic scale Build applications faster and without limits for more complex business logic or compute-intensive traffic/request activity. Salesforce Functions retains all the security and compliance you trust Salesforce to provide, so you no longer need to deal with VPNs, security tokens, Cloud IAM, and all the DIY complexity when you go off of the Salesforce Platform. Open languages and framework support in your SFDX project, including Java and Node.js Functions let you program in industry-standard languages, such as Node.js and Java. This brings the expressive power of these languages to your apps, as well as the entire ecosystem of tools, libraries, and developers to accelerate your time to market. Familiar tools and native low code integration Functions are fully integrated into the Salesforce Developer Experience and are invoked directly from Apex, making them easy to add to Flows and the simplest way to add complex business logic to your apps. One CLI for development The Salesforce CLI is being enhanced with a new global executable, sf, that simplifies how you build, manage, and deploy across Salesforce. Functions use case: running compute heavy and high-performance workloads In this blog post, we’re going to create a Java Function that processes a very large data set. Without Functions, it would be impossible to handle a data set this large in Apex, and many users would have had to implement complex workarounds to remain within their Apex limits. With Functions, you can overcome these kinds of computational limitations. In this example, the Function loads the complete six-thousand-record data set into memory. In the following example, we will use Functions to find a code school that is closest to a specific geographic point. It will also iterate over the data set to calculate the distance from a point of origin, sorting the results by distance, and then returning the ones that are closer to the provided location. This can be done in a few simple steps: Write a Function in an SFDX project Run and debug your Function locally to validate logic Deploy the Function to a Salesforce Org Integrate with low code: invoke the Function through Apex Done – you’ve leveraged the compute capabilities from declarative tools. Functions can be written in a Salesforce DX project by using the Salesforce CLI or Visual Studio Code editor with the Salesforce Extension Pack. To create a project with this new command structure using the Salesforce CLI, run: $ sfdx generate:project -n sfdx_functions_project The Visual Studio Code editor with the Salesforce Extension Pack will create a project with the necessary files to start developing for the Salesforce Platform. After creating the project, we can start writing our Functions, by using either Java or JavaScript. Let’s generate the processlargedata function in Java with the Salesforce CLI: $ sfdx generate:function -n processlargedata -l java Or using the Visual Studio Code SFDX: Create Function command: Generate a Function from Visual Studio Code This will generate a Java project under the functions folder with all the necessary files to write your Function and run tests locally. Let’s update the auto-generated Function with the use case we described above. The full source code for this project in the Functions Recipes Sample Application is available on Github.com. { school.setDistance( distance( latitudeSt, longitudeSt, school.getLatitude(), school.getLongitude())); return school; }) .sorted(Comparator.comparingDouble(School::getDistance)) .limit(length) .collect(Collectors.toList()); LOGGER.info("Function successfully filtered {} schools", schools.size()); return new FunctionOutput(schools); } // ... A Java Salesforce Function receives two parameters: an InvocationEvent that contains the input payload of the Function the Context, which has access to the authenticated Salesforce Org and the SDK. (Note: Node.js Functions contains a 3rd parameter Logger, which is used for logging operations). This ProcessLargeDataFunction receives a JSON payload with latitude, longitude, and length, and returns a list of the nearest schools to that starting point specified in the input payload. Now, let’s see how can we run this Function locally. Running your first Function A Salesforce Function can be executed locally by using the CLI, which is a useful way to develop and test your Function without deploying it to a Salesforce Org. Local execution can be also integrated with an authenticated Salesforce Org when doing the invocation. You can start this Function locally by running: $ sfdx run:function:start Or by using the Visual Studio Code SFDX: Start Function command: Start a Function from Visual Studio Code This will build and run the Function locally, and it will be ready to start receiving invocation requests. A Function running locally from Visual Studio Code Now that our Function is running locally, we will use a JSON payload to invoke the Function. Let’s create a payload.json in the function folder with the following information: { "latitude": "36.169090", "longitude": "-115.140579", "length": 5 } This payload information represents the point of origin and the number of results it will return. It will be received by the Function in the InvocationEvent object. You can invoke the Function with this input payload from the CLI by running: $ sfdx run:function --url=http://localhost:8080 [email protected] Or, you can do this from Visual Studio Code by opening the payload.json file, and clicking on the Invoke CodeLens action: Invoking a Function from Visual Studio Code with CodeLens You have seen how to generate, run, and invoke your first Salesforce Function using the Salesforce Developer Tools. Now it is time to connect to a Salesforce Organization, create a compute environment, and deploy the Function. Deploying your first Function We have been able to run our Function locally thanks to the Salesforce Developer Tools, but the real power of Salesforce Functions comes when they are running in our serverless compute environment. Let’s deploy our Function to a Salesforce Organization. To do that, we need to create a Compute Environment and connect it to an Org by running: $ sfdx env:create:compute -o connected_org_alias -a compute_env_alias Then, we need to deploy our Salesforce project and Functions. The upcoming sf CLI will allow you to deploy your project metadata along with the Function in a single command. But until then, we have to do that using sfdx in two steps: $ sfdx force:source:push $ sfdx project:deploy:functions -o connected_org_alias Now that our project is deployed, we can invoke the Function from Apex by using the new Function class: functions.Function fn = functions.Function.get('sfdx_functions_project.processlargedata'); functions.FunctionInvocation invocation = fn.invoke('{"latitude": "36.169090", "longitude": "-115.140579", "length": 5}'); String jsonResponse = invocation.getResponse(); System.debug('Got response' + jsonResponse); Triggering a Function with Apex from the Developer Console Integrating your Function with low-code tools Now that our Function can be invoked through Apex, we can integrate it with a Flow or Lightning Web Component. Let’s create an Apex class, FindCodeSchools.cls, that invokes the ProcessLargeData Function from a Flow. The full source code for this project in the Functions Recipes Sample Application repo is available on Github.com. input) { Input payload = input.get(0); // Get a Reference of the ProcessLargeData Function functions.Function fn = functions.Function.get( 'sfdx_functions_project.processlargedata' ); // Invoke the ProcessLargeData Function functions.FunctionInvocation invocation = fn.invoke( JSON.serialize(payload) ); String response = invocation.getResponse(); // Serialize the Response into an Object Output output = (Output) JSON.deserialize(response, Output.class); return output.schools; } // ... } With this Apex class with an @InvocableMethod, we will create a new Flow that triggers this method as an Apex action and use the output as we see fit. You can also trigger the Function from an LWC component by using the @AuraEnabled annotation. Invoke the FindSchools Apex Method from a Flow As you can see below, we seamlessly integrate the power of the compute capabilities of Salesforce Functions with the low-code simplicity of Flow. Flow integrated with a Salesforce Function Learn more We’re excited to see what you build using Salesforce Functions. Please nominate yourself for the Invite Beta. About the authors Julián Duque is a Lead Developer Advocate at Salesforce. Connect with him on Twitter @julian_duque. Khushboo Goel is a Sr. Product Marketing Manager at Salesforce. Connect with her on Twitter @kgoel31.
0 notes
Link
本記事の内容は可能な限り正確な情報を記載するよう努めていますが、 必ずしも内容の正確性や安全性を��証するものではありません。 当記事を参照・利用したことによってトラブルが発生しても一切の責任を負いかねます。 また、本記事にて記載している検証行為はすべて筆者の developer 環境で行っております。 はじめに 2020年の末ごろから、Salesforce の設定不備による情報漏洩を伝えるニュースが立て続けに報じられるようになりました。 この問題を一番よく伝えているのは日経クロステックで、同紙によると現在までに、多数の企業で影響があったとされています。(注:ただし、報じられている企業の多くは、プレスリリースでは「クラウド型システム」というような表現に留めており、Salesforce のことであるとは発表しておりません) また、02/12には両備システムズから Salesforce を利用した自治体向けのシステムでも同様の問題が生じたことが発表され、この問題は企業だけでなく多数の自治体・団体にまで波及する事態となっています。 これに対して Salesforce は12月25日から各種のアナウンスを出して、導入各社に設定を見直すように呼びかけを行っていますが、Salesforce のお知らせは、ゲストユーザに対する共有に関する設定がお客様の用途に沿った設定になっているかどうかはお客様にご確認いただく必要がございます というスタンスの案内となっています。 そのために具体的に何をどうすればよいのか、何が間違いであるのか、間違えた場合に何が起きるのかを理解しづらい状況になっており、まだ問題を抱えながらも修正できていない管理者がいるのではないかと思われます。 実際に、02/10 に公表された西条市のプレスリリースでは、他社事例の存在を把握しながらも問題に気付けなかったことが経緯に記されています。 経緯 令和2年12月29日 受託事業者が、本システムに係るセキュリティ上の問題に関する注意喚起情報及び2つの対策について関連事業者から提案を受けて同事業者と協議・検討した結果、設定変更は必要ないと判断 令和3年1月20日 内閣サイバーセキュリティセンター(以下「NISC」)から総務省経由で市に対し、「本システムについて、意図しない情報が外部から参照される可能性がある旨」の注意喚起を受けたため、市から受託事業者に対して調査開始を指示(市はこの時点で認知) 1月22日 受託事業者から市に対し「問題なし」との回答あり 1月23日 市から総務省へ「問題なし」と報告 1月27日 再度、NISCから総務省経由で市に対し、「申請者の一部情報が参照できる可能性がある製品について、各種設定の確認・見直しを行うなど、適切なセキュリティ対策を講じるよう」との連絡があり、受託事業者に再確認と対処を指示 1月29日 受託事業者において指示内容を検討した結果、本システム設定の一部を変更する対策を実施 2月1日 受託事業者が不正アクセスに対するすべての設定変更を実施 2月5日 受託事業者の調査(ログの解析)により、不正アクセスの事実(1月9日及び12日にアクセス)が判明本シ���テムを閉鎖し、利用者全員に注意喚起のメールを配信 プレスリリース:「総合健診Web予約システム」への不正アクセスに関するご報告 そこで逆に考えて、情報が漏洩してしまうような設定や実装例を実際に作ることで、 この問題が理解しやすくなるのではないかと思い、本記事を書いてみることにしました。 一連の問題に対する Salesforce からのアナウンス 以下のようなアナウンスを公表しています 流出の原因とみられるアクセス経路 Salesforce 社は現時点(2021/02/13)でこの一連の問題の詳細な原因を公表していません。 しかし、いくつかの公開されている情報から、この問題の流出経路を推測することができます。 Teamspirit の発表 まず、Teamspirit は12/29のリリースで、2020/12/25 の Salesforce 社のプレスリリースを参照したうえで、具体的に Sites 機能を用いたシステムで問題があったことを発表しています。 2020年12月26日の当社発表(※1)のとおり、株式会社セールスフォース・ドットコムの発表をうけて調査を継続しておりました当社が利用する対象製品(※2)の影響範囲にかかる調査が終了いたしましたのでご報告いたします。 調査の結果、現在は利用されていませんが、「Salesforceサイト」を用いた2つのシステムにおいて、ゲストユーザへの情報共有に関する設定が本事象(※3)の生じる条件下にあったことを確認いたしました。これらのシステムは既に設定を変更し本事象の生じない状態となっております。 https://www.teamspirit.com/ja-jp/news/release/post-20200513.html 発端となったと思われるブログ記事 また、昨年の10月に海外のセキュリティ研究者が以下のブログを公開しており その中で aura endpoint (以降「Auraエンドポイント」と記す)と呼ばれるURLに特定のリクエストをPOSTすると、ゲストユーザが参照できるレコードを得ることができるのをはじめ、様々な操作ができることを紹介しています。 日本では昨年末に次の2つのブログでこのブログ記事と一連の問題を紹介しており、去年からこの問題をウォッチされている方にとってはおなじみの記事ではないでしょうか。 日経クロステックの報道 最後に、日経クロステックで、原因は「Auraエンドポイント」と呼ばれる機能であると報じられています。 トラブルの火種になったのは、Lightning Experienceのリリース当初から部品の1つとして提供されていたとみられる「Auraエンドポイント」だ。同部品���使うと、セールスフォース製品が従来備える「オブジェクト」と呼ばれるデータベースに対し、第三者が「ゲストユーザー」の権限で直接アクセスできるようになる。ゲストユーザーとはアンケートフォームへの回答者などセールスフォースのサービスのアカウントを持たない人を指す。 https://xtech.nikkei.com/atcl/nxt/mag/nc/18/092400133/012800042/ これらの情報を合わせると、一連の問題の流出経路は「元ブログ」で紹介されている手法を用いて、ゲストユーザが参照可能なレコードをAuraエンドポイントを通じて取得されたと見て間違いなさそうです。 実際に公開されている方法を試してみましょう では実際に外部からレコードの情報を取得されてしまうような状況を作って、Auraエンドポイントからデータにアクセスされるとはどのようなことなのかを確かめてみましょう。 例では「取引先」オブジェクトで試してみます。 前章で挙げた3つのブログ記事から、このAuraエンドポイントによるレコードの取得は以下の条件を満たすときに機能することが分かっています。 サイトとその「ゲストユーザ」が有効である ゲストユーザが参照できるレコードが存在する サイトの詳細設定画面で「ゲストユーザの Lightning 機能」が有効になっている この状況を作ったうえで、元ブログの内容からPOSTリクエストを作成して、実際にレコードが取得できるか実験します。 サイトを作成して「ゲストユーザの Lightning 機能」を有効にする オブジェクトとそのレコードをゲストユーザから参照可能な状態にする 問題を再現するためにゲストユーザがレコードを参照できるよう設定を追加します。 オブジェクトと項目の参照権限をゲストユーザに付与する(作成権限もついていますが気にしないでください) オブジェクトのレコードをゲストユーザから参照できるように共有設定をする テストデータを適当に作る 実際にAuraエンドポイントにリクエストをPOSTする 以下は取引先(=Account)オブジェクトでゲストユーザが参照できるレコードの一覧を取得するリクエストで、そのレスポンスには先ほど作成した取引先のレコード testAccount の情報が含まれていることがわかります。 Salesforce は一連の問題に脆弱性は無いと言っているので、このPOSTリクエストは公開しても問題ないと思います。(実際Lightning 機能を利用しているページでは、ブラウザからAuraエンドポイントに対する通信は普通に行われるようです) しかし、濫用防止のためにリクエストの一部分を伏せさせていただいています。実際のリクエストパラメータの作り方については元ブログを参照してください。 レコードがゲストユーザから参照される条件 ゲストユーザがレコードに対してアクセスできる状態とは、ひとつの設定によるものではなく複数の設定の組み合わせの結果に生まれる状態を意味します。 具体的には 所有者 組織の共有設定 オブジェクトの共有ルール オブジェクトの参照権限 オブジェクト内の項目の参照権限 ロール などなどですが、これを解説すると記事1本分の長さになってしまうのでこちらについては他の方が書かれた記事、または、Trailhead のデータセキュリティの章を参照してください。 うちも不安...という方向けのsalesforceアクセス権を安全に保つ5つの確認箇所 Trailhead データセキュリティ また、ゲストユーザの場合は昨今の仕様変更により徐々に制限が厳しくなっているなど、 仕様を正確に把握するのはなかなか面倒です。(spring'21 のリリースでもまた変更があります) winter'21以降ではレコードの所有者にゲストユーザを新たに設定したり、組織の共有設定やキューによってゲストユーザに対して参照権限を付与することはできません。 ゲストユーザのセキュリティポリシーとタイムライン ゲストユーザの共有設定とレコードアクセスの保護 [ゲストユーザの組織の共有設定と共有モデルの保護] の無効化不可 Salesforce のアナウンスで公表されていないこと Aura エンドポイントについて そもそもにおいて、このAura エンドポイントと呼ばれているAPIに関するドキュメントは見当たりません。 このAPIが一体どういうものなのか、リストを取得する際に呼ばれている SelectableListDataProviderController とはどういう機能であるのかは現時点では不明です。 「ゲストユーザのLightning機能」について 事実として、サイトの設定画面の「ゲストユーザのLightning機能」のチェックを外すと、先の漏洩を起こすリクエストを受け付けなくなります。 今まさに本手法により情報漏洩してしまう状態になってしまっているならば、この設定をOFFにすることでとりあえずの止血ができると思うのですが、Salesforce はこの点についても何も言及していないので断言はできません。 チェックを外して、先ほどのリクエストを再度 POST すこと、404を返すようになります。 アンチパターンに陥りやすいと思われる実装例 実際に情報漏洩が起きてしまう様子はわかりました、では次にこの状況を生み出してしまうようなサイトの実装について考えてみましょう。 この問題を引き起こしやすいのは、やはり visualforce の Apex:inputField を 使ってオブジェクトに紐づいたフォームを作った場合ではないかと思います。なぜかというと、この Apex:inputField を使うとオブジェクトに関連した入力フォームを作ることができますが、オブジェクトと項目に対してゲストユーザの作成権限を付与しなければならず、漏洩状態の条件の一つを作り出してしまうためです。(これ単体では条件を満たしません) Apex:inputField を使ったフォームの実装例 サンプルとして取引先(Account)の名前と電話番号を入力するシンプルなフォームを作ります コントローラを用意 visualforce ページを用意 オブジェクトの作成権限と、項目の編集アクセス権を付与 サイトの設定でページを追加 簡易な入力フォームの完成 これでページ名をパスにしてアクセスすると、あっというまにフォームが出来上がりました オブジェクトとその項目にゲストユーザの権限が無いと機能しない しかしこのフォームはオブジェクトと項目に対するゲストユーザの権限がないと機能しません これは取引先の項目の権限から電話番号を抜いた場合の表示例です。このように権限がないとフォームが表示されなくなります。 登録フォームだけなら直ちに問題ではない このような実装でレコードを登録するフォームを公開しただけの場合は、直ちに情報漏洩につながるわけではありません。 これは作成したレコードにゲストユーザからアクセスする権限を付与していないためで、レコードのゲストユーザ共有ルールなどを設定しない限りは問題ありません。前の章で実験したときは外部からアクセスできるようにその設定を追加していました。 例外としてはオブジェクトの参照権限の「すべてのデータの変更」「すべてのデータの参照」があります。 この設定はいろいろオーバーライドするのでややこしいです。しかしこの権限も spring'21 でゲストユーザからは削除されました。 「すべて表示」および「すべて変更」権限の概要 所有者 "ゲストユーザ" 問題 ところが以前はこの実装にも問題がありました。レコードの所有者が"ゲストユーザ"になってしまう場合です。 winter'21 以降はゲストユーザがレコードの所有者になることは無くなりました。 ゲストユーザによって作成されたレコードのデフォルトの所有者への自動的な割り当て しかし、この変更が適用される前に作成されたレコードで所有者がゲストユーザであるものは、現在においてもそのままになっている可能性があります。 この点見落としがちであると思うので、心当たりのある方は既存レコードの所有者を再点検することをお勧めします。 詳しくは Salesforce の資料[JP] Salesforce_ゲストユーザセキュリティ_ベストプラクティスの解説 (要 Trailblazersコミュニティログイン)の「確認項目2-5 レコードの所有者」を確認してください。 編集フォーム(winter'21 以前)や、レコードを参照する処理は要注意 spring'21 によってゲストユーザのオブジェクトに対する「編集」「削除」「すべてのデータの変更」「すべてのデータの参照」の権限が削除されて先述のような apex:inputField を用いて、レコードを編集するようなフォームを簡単に作成することはできなくなりました。 逆に言うと今まではそれができたわけで、ゲストユーザからレコードへの参照・上書きを伴うフォームが存在することは、それほど不思議ではないと思います。(URLのパラメータに、レコード ID とトークンなどを持たせることでそれなりに安全に実装できました) しかし、その実装をするためには、ゲストユーザがレコードを参照・編集できる必要があるために、今回の問題を引き起こす"設定不備"につながりやすかったのではないかと思われます。 現在は without sharing を利用してシステムコンテキストで実行するような実装が多いのでしょうか。(普段サイトを使わないので、間違っていたらすいません。) 余談ですが spring'21 適用によってそのような編集フォームが使えなくなってお困りの方は、こちらの資料も参考にするといいかもしれません。 Guest User Record Access Development Best Practices このような実装はベストプラクティスではなかったのか? apex:inputField を使ってオブジェクトに紐づいたフォームを実装するのは普通のことではないかと思います。 なので、レコードに対する参照設定が問題の本質とは思いますが、古い資料にはそのあたりの記述が見当たらないために、2018年以前からそういう観点があったのかどうかはわかりません。 Salesforceで、取引先責任者の登録フォームをつくる方法 2014年に書かれたこちらのブログは先ほど紹介した方法と同じで、apex:inputField を使ってオブジェクトに対応したフォームを作っています。 Learning Apex Programming 2015年に出版された書籍ですがChapter6(P141~147)で visualforce ページをサイトで公開する手順について記されています。 ここでも apex:inputField を使ってオブジェクトに対応したフォームを作っています。所有者や共有設定についてについて特に記述はありませんでした。 なお著者の一人 Matt Kaufman 氏は執筆当時 salesforce.com スタッフであると紹介されています。 Trailhead Web サイトインテグレーションの開始 私が探した限り、Trailhead で唯一のサイトに関するガイドがあったものです。AppExchange でインストールしたサイトをセットアップする手順が記載されていますが、現在のゲストユーザでの仕様では設定できない内容を含みます。ここでは当時はゲストユーザにも有効だった「組織の共有設定」をしていて、取引先責任者に「公開/参照・更新可能」を設定して、項目の参照権限も与えています。ちょっと?な感じではありますが、今の仕様に無い設定は検証できないので何とも言えません。 まとめ 最近話題になっている Salesforce の設定不備による情報流出事故について、流出方法とされてるアクセス方法や、その状況を作りやすい実装について検証しました この問題は複数の設定の組み合わせで発生するので、 "単なる設定ミス" といえるほど単純ではありません 実際に手を動かして試してみることをおすすめします 普段サイトを使っていなくても、レコードに対する権限設定を理解するためには良い題材であると思います。私も知らなかったことを新たに知ることができました。 Salesforce のサイトで、フォームを作っている人はは今一度設定を再確認しましょう 特に 2019年以前に作成されたレコードで、所有者がゲストユーザのままになっているものが残っていないかチェックしましょう 不明なことはは SF のサポートに聞いてください セールスフォースはできればプレスリリースを消さないでください(12/25 のプレスリリースのことです) 【余談】自治体向けのシステムで事故が起きたことについて 今回の一連の問題は、民間企業だけでなく、自治体のシステムにおいても流出事例が起きる事態となりました。 自治体のシステムで問題が起きることは、民間のサービスで問題が起きることとは意味合いが異なります。 それは、公共サービスはその地域の住人の税金によってほぼ独占的に運営され、仮に Salesforce が嫌いだからと言って他を選択することができないからです。また、クラウドサービスは一度導入されると乗り換えや管理者の変更が難しいため、固定化されてしまいがちな問題もあります。(コロコロ変えていいものでもないですが) ですから、西条市のケースのように問題に気付きながらも難解なアナウンスのために要点を理解できず対応が遅れ、本来防げたはずの不正アクセスが行われたかもしれないことや、Salesforce でありがちなログの入手や監視の難しさ(端的に書くと別料金が必要)といったような事柄については、導入していた自治体は強く改善を求めるべきだと思います。 加えて、両備システムズの i-Blend はセールスフォース社自身もプッシュしていたことが確認できるので、この自治体システムの問題に関しては Salesforce 社も他人事というわけにはいかないはずです。 Salesforce ソリューションガイド 住民向けモハイルアフリ構築フラットフォームi-blend 以上となりますが、Salesforce 社にはこれ以上の被害が拡大しないためにも、よりいっそう丁寧なアナウンスとサポートをしていただきたいと思います。 正しいことを言うよりも。。。なんでしたっけ?御社のCMで何か言っていた気がしますが言うだけではないですよね。 追記 (02/16) 誤字と軽微な表現の修正をしました。 両備システムズのプレスリリース(第3報)を資料に追加 参考資料 プレスリリースなど 報道記事 Salesforce その他web 書籍
0 notes